成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

利用SQOOP將數據從數據庫導入到HDFS

企業動態
本文程序導入到HDFS中的數據是文本格式,所以在創建Hive外部表的時候,不需要指定文件的格式為RCFile,而使用默認的TextFile即可。數據間的分隔符為'\001'.如果多次導入同一個表中的數據,數據以append的形式插入到HDFS目錄中。

基本使用

如下面這個shell腳本:

  1. #Oracle的連接字符串,其中包含了Oracle的地址,SID,和端口號 
  2. CONNECTURL=jdbc:oracle:thin:@20.135.60.21:1521:DWRAC2 
  3. #使用的用戶名 
  4. ORACLENAME=kkaa 
  5. #使用的密碼 
  6. ORACLEPASSWORD=kkaa123 
  7. #需要從Oracle中導入的表名 
  8. oralceTableName=tt 
  9. #需要從Oracle中導入的表中的字段名 
  10. columns=AREA_ID,TEAM_NAME 
  11. #將Oracle中的數據導入到HDFS后的存放路徑 
  12. hdfsPath=apps/as/hive/$oralceTableName 
  13. #執行導入邏輯。將Oracle中的數據導入到HDFS中 
  14. sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath  --num-mappers 1 --table $oralceTableName --columns $columns --fields-terminated-by '\001' 

 

執行這個腳本之后,導入程序就完成了。

接下來,用戶可以自己創建外部表,將外部表的路徑和HDFS中存放Oracle數據的路徑對應上即可。

注意:這個程序導入到HDFS中的數據是文本格式,所以在創建Hive外部表的時候,不需要指定文件的格式為RCFile,而使用默認的TextFile即可。數據間的分隔符為'\001'.如果多次導入同一個表中的數據,數據以append的形式插入到HDFS目錄中。

并行導入

假設有這樣這個sqoop命令,需要將Oracle中的數據導入到HDFS中:

  1. sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath  --m 1 --table $oralceTableName --columns $columns --fields-terminated-by '\001'  --where "data_desc='2011-02-26'" 

請注意,在這個命令中,有一個參數"-m",代表的含義是使用多少個并行,這個參數的值是1,說明沒有開啟并行功能。

現在,我們可以將"-m"參數的值調大,使用并行導入的功能,如下面這個命令:

  1. sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath  --m 4 --table $oralceTableName --columns $columns --fields-terminated-by '\001'  --where "data_desc='2011-02-26'" 

一般來說,Sqoop就會開啟4個進程,同時進行數據的導入操作。

但是,如果從Oracle中導入的表沒有主鍵,那么會出現如下的錯誤提示:

  1. ERROR tool.ImportTool: Error during import: No primary key could be found for table creater_user.popt_cas_redirect_his. Please specify one with --split-by or perform a sequential import with '-m 1'. 

在這種情況下,為了更好的使用Sqoop的并行導入功能,我們就需要從原理上理解Sqoop并行導入的實現機制。

如果需要并行導入的Oracle表的主鍵是id,并行的數量是4,那么Sqoop首先會執行如下一個查詢:

  1. select max(id) as maxselect min(id) as min from table [where 如果指定了where子句]; 

通過這個查詢,獲取到需要拆分字段(id)的***值和最小值,假設分別是1和1000.

然后,Sqoop會根據需要并行導入的數量,進行拆分查詢,比如上面的這個例子,并行導入將拆分為如下4條SQL同時執行:

  1. select * from table where 0 <= id < 250; 
  2. select * from table where 250 <= id < 500; 
  3. select * from table where 500 <= id < 750; 
  4. select * from table where 750 <= id < 1000;    

 

注意,這個拆分的字段需要是整數。

從上面的例子可以看出,如果需要導入的表沒有主鍵,我們應該如何手動選取一個合適的拆分字段,以及選擇合適的并行數。

再舉一個實際的例子來說明:

我們要從Oracle中導入creater_user.popt_cas_redirect_his.

這個表沒有主鍵,所以我們需要手動選取一個合適的拆分字段。

首先看看這個表都有哪些字段:

然后,我假設ds_name字段是一個可以選取的拆分字段,然后執行下面的sql去驗證我的想法:

  1. select min(ds_name), max(ds_name) from creater_user.popt_cas_redirect_his where data_desc='2011-02-26' 

發現結果不理想,min和max的值都是相等的。所以這個字段不合適作為拆分字段。

再測試一下另一個字段:CLIENTIP

  1. select min(CLIENTIP), max(CLIENTIP) from creater_user.popt_cas_redirect_his where data_desc='2011-02-26'  

這個結果還是不錯的。所以我們使用CLIENTIP字段作為拆分字段。

所以,我們使用如下命令并行導入:

  1. sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath  --m 12 --split-by CLIENTIP --table $oralceTableName --columns $columns --fields-terminated-by '\001'  --where "data_desc='2011-02-26'" 

這次執行這個命令,可以看到,消耗的時間為:20mins, 35sec,導入了33,222,896條數據。

另外,如果覺得這種拆分不能很好滿足我們的需求,可以同時執行多個Sqoop命令,然后在where的參數后面指定拆分的規則。如:

 

  1. sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath  --m 1 --table $oralceTableName --columns $columns --fields-terminated-by '\001'  --where "data_desc='2011-02-26' logtime<10:00:00" 
  2. sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath  --m 1 --table $oralceTableName --columns $columns --fields-terminated-by '\001'  --where "data_desc='2011-02-26' logtime>=10:00:00" 

 

從而達到并行導入的目的。

【本文為51CTO專欄作者“王森豐”的原創稿件,轉載請注明出處】

責任編輯:龐桂玉 來源: 神算子
相關推薦

2020-11-13 11:12:59

Navicat

2010-10-22 11:22:33

SQL Server數

2024-04-09 13:20:00

Excel數據庫數據

2010-06-01 13:47:19

2010-04-22 11:58:00

Oracle數據庫

2010-10-28 11:48:38

ORACLE數據導入

2021-09-09 17:41:54

MySQLNavicat工具

2011-04-08 10:43:08

mysql數據access數據庫

2009-04-10 09:06:16

Windows Emb

2021-06-01 21:55:33

物聯網 IoTDB數據庫

2025-03-31 08:20:00

SQL 查詢數據庫dsq

2010-10-20 14:56:18

2021-05-07 05:54:43

數據庫數據湖數據

2023-11-29 09:53:29

數據庫遷移SQL Server

2012-02-21 10:10:16

2018-10-15 13:57:38

Hadoop數據庫MySQL

2011-05-13 09:42:21

2010-05-19 15:01:14

MySQL數據導入

2012-06-20 11:17:02

MemSQL

2021-04-16 07:19:04

Hive數據類型Hql
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 激情久久网 | 亚洲精品视频一区二区三区 | 岛国二区 | 国产精品婷婷 | 日本高清中文字幕 | 国产一级毛片精品完整视频版 | 成人黄色电影免费 | 欧美一级欧美三级在线观看 | 久久久成人免费视频 | 91成人在线视频 | 日本中文在线 | 国产在线二区 | 99视频入口 | 奇米四色影视 | 久久五月婷 | 欧美xxxⅹ性欧美大片 | 欧美日韩综合一区 | 久久亚洲精品视频 | 国产三级精品三级在线观看四季网 | 日日骚av| 一区二区在线 | 91美女在线观看 | 国产成人免费视频 | 毛片在线视频 | 日韩精品一区二区三区在线观看 | 91久久精品一区二区二区 | 99久久久久久 | 亚洲综合热 | 在线免费国产视频 | 午夜精品久久久久久久 | 亚洲国产精品久久久久婷婷老年 | 日韩免 | 福利社午夜影院 | 中文字幕亚洲视频 | 亚av在线| 免费成人高清 | 免费国产黄网站在线观看视频 | 欧美久久久久久久 | 日韩久久综合网 | 日韩资源| 一级毛片在线播放 |