成人免费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專欄作者“王森豐”的原創稿件,轉載請注明出處】

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

2010-10-22 11:22:33

SQL Server數

2020-11-13 11:12:59

Navicat

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

2025-03-31 08:20:00

SQL 查詢數據庫dsq

2021-06-01 21:55:33

物聯網 IoTDB數據庫

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

2011-05-13 09:42:21

2010-05-19 15:01:14

MySQL數據導入

2018-10-15 13:57:38

Hadoop數據庫MySQL

2012-06-20 11:17:02

MemSQL

2021-04-16 07:19:04

Hive數據類型Hql
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品视频在线 | 亚洲一区免费视频 | 成人免费精品视频 | 伊人久久大香线 | 亚洲一区二区三区四区五区中文 | 国产精品免费看 | 高清一区二区三区 | 国产一伦一伦一伦 | 北条麻妃av一区二区三区 | 国产欧美精品一区二区三区 | 免费激情网站 | 一区二区三区在线看 | 免费午夜电影 | 亚洲精品久久久蜜桃 | 国产色 | 成人在线小视频 | 有码在线 | 国产精品二区三区在线观看 | 玖玖视频免费 | 中文字幕一区二区三区乱码在线 | 一区二区精品在线 | 五月婷婷亚洲 | 国产xxxx岁13xxxxhd| 欧州一区二区三区 | 成人在线视频免费看 | 亚洲国产高清高潮精品美女 | 高清视频一区二区三区 | 国产高清精品一区二区三区 | 日日干日日色 | 91精品国产一区二区在线观看 | 久草新视频 | 精品久久久久久久久久久久久久久久久 | 欧美日韩在线免费观看 | 午夜免费网站 | 欧美精品1区2区 | 欧美乱做爰xxxⅹ久久久 | 玖玖视频 | www.日韩欧美 | 欧美性一区二区三区 | 综合久 | 欧美中文字幕在线观看 |