Sqoop導入導出Hive示例

Sqoop是連接傳統關係型數據庫和Hadoop的橋樑。把關係型數據庫的數據導入到 Hadoop 系統 ( 如 HDFS、HBase 和 Hive) 中;把數據從 Hadoop 系統裏抽取並導出到關係型數據庫。利用MapReduce,批處理方式進行數據傳輸。

本篇文章主要是根據Sqoop導入導出實際示例,對Sqoop中的import與export進行簡要介紹:

--先在Hive建表(oracle庫有已建好的表TC_INTE_BID_PLANSIGN)
CREATE TABLE dragonball.dragonball_tc_inte_bid_plansign(
id decimal(38,6),
plan_sign string,
remark string,
annualized_ratio decimal(38,6),
state decimal(38,6),
plan_type decimal(38,6),
create_time timestamp,
create_user string,
update_time timestamp,
update_user string,
has_profit decimal(38,6)
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001' 
STORED AS TEXTFILE
LOCATION '/user/hive/dragonball/dragonball_tc_inte_bid_plansign.db/DRAGONBALL_TC_INTE_BID_PLANSIGN'; 


1、導入oracle數據到HDFS中(注:導入oracle表,表名和字段名要大寫)
sqoop import \
--connect jdbc:oracle:thin:@192.168.30.220:1521/orcl_test \
--username NWD \
--password peYQrowG \
--table NWD.TC_INTE_BID_PLANSIGN \
--target-dir /user/hive/dragonball/dragonball_tc_inte_bid_plansign.db/DRAGONBALL_TC_INTE_BID_PLANSIGN/ \
--delete-target-dir \
--fields-terminated-by '\0x01' \
--compress \
--compression-codec org.apache.hadoop.io.compress.GzipCodec \
-m 4 \
;


2、導入oracle數據到HDFS(同時創建hive表,同時load數據到hive中)
sqoop import \
--connect jdbc:oracle:thin:@192.168.30.220:1521/orcl_test \
--username NWD \
--password peYQrowG \
--table NWD.TC_INTE_BID_PLANSIGN \
--fields-terminated-by '\0x01' \
--compress \
--compression-codec org.apache.hadoop.io.compress.GzipCodec \
-m 4 \
--hive-import \
--create-hive-table \
--hive-database dragonball \
--hive-table dragonball_tc_inte_bid_plansign \
--map-column-hive ID=String,PLAN_SIGN=String,STATE=String,HAS_PROFIT=String,PLAN_TYPE=String \
;

注意:
–create-hive-table 生產上不建議使用,字段類型和我們自己預想會有差別 
而且只能執行一次(再執行一次,會報表已經存在的錯誤)
–hive-import 在導入的時候,會默認去讀Hive的default數據庫,最好指定--hive-database
–hive-table 不需要自己先去Hive中創建表,執行的時候,會自動幫我們去創建相應的表


3、導入oracle數據到HDFS中(使用where條件導入)
(-P從控臺提示手動輸入密碼)
sqoop import \
--connect jdbc:oracle:thin:@192.168.30.220:1521/orcl_test \
--username NWD \
-P \
--table NWD.TC_INTE_BID_PLANSIGN \
--target-dir /user/hive/dragonball/dragonball_tc_inte_bid_plansign.db/DRAGONBALL_TC_INTE_BID_PLANSIGN/ \
--delete-target-dir \
--fields-terminated-by '\0x01' \
--compress \
--compression-codec org.apache.hadoop.io.compress.GzipCodec \
-m 4 \
--where "PLAN_SIGN='M1'" \
;

4、導入oracle數據到HDFS中(使用query查詢語句 )
(注:使用-query參數不能與--table參數一起使用,且where語句的最後必須跟$CONDITIONS,$CONDITIONS就是標記當前mapper從哪個數據段開始讀。--query後邊如果是雙引號,$CONDITIONS必須加\,避免shell識別爲自己的變量。)
sqoop import \
--connect jdbc:oracle:thin:@192.168.30.220:1521/orcl_test \
--username NWD \
--password peYQrowG \
--target-dir /user/hive/dragonball/dragonball_tc_inte_bid_plansign.db/DRAGONBALL_TC_INTE_BID_PLANSIGN/ \
--delete-target-dir \
--fields-terminated-by '\0x01' \
--compress \
--compression-codec org.apache.hadoop.io.compress.GzipCodec \
-m 4 \
--split-by id \
--query 'select * from NWD.TC_INTE_BID_PLANSIGN where id < 3200000663615020 and $CONDITIONS' \
;


5、導入oracle數據到HDFS中(導入部分指定字段,其他未指定字段值爲null)
sqoop import \
--connect jdbc:oracle:thin:@192.168.30.220:1521/orcl_test \
--username NWD \
--password peYQrowG \
--table NWD.TC_INTE_BID_PLANSIGN \
--target-dir /user/hive/dragonball/dragonball_tc_inte_bid_plansign.db/DRAGONBALL_TC_INTE_BID_PLANSIGN/ \
--delete-target-dir \
--fields-terminated-by '\0x01' \
--compress \
--compression-codec org.apache.hadoop.io.compress.GzipCodec \
-m 4 \
--columns ID,PLAN_SIGN,STATE,HAS_PROFIT \
;


6、導入oracle數據到HDFS中(追加導入)
(注:–incremental append 與 –delete-target-dir之間不能同時使用)
(Append方式--按遞增列的增量數據導入)

sqoop import \
--connect jdbc:oracle:thin:@192.168.30.220:1521/orcl_test \
--username NWD \
--password peYQrowG \
--table NWD.TC_INTE_BID_PLANSIGN \
--target-dir /user/hive/dragonball/dragonball_tc_inte_bid_plansign.db/DRAGONBALL_TC_INTE_BID_PLANSIGN/ \
--fields-terminated-by '\0x01' \
--compress \
--compression-codec org.apache.hadoop.io.compress.GzipCodec \
-m 4 \
--incremental append \
--check-column  id \
--last-value 3200000663615020 \
;

(LastModified方式--按時間列的增量數據導入)
sqoop import \
--connect jdbc:oracle:thin:@192.168.30.220:1521/orcl_test \
--username NWD \
--password peYQrowG \
--table NWD.TC_INTE_BID_PLANSIGN \
--target-dir /user/hive/dragonball/dragonball_tc_inte_bid_plansign.db/DRAGONBALL_TC_INTE_BID_PLANSIGN/ \
--fields-terminated-by '\0x01' \
--compress \
--compression-codec org.apache.hadoop.io.compress.GzipCodec \
-m 4 \
--incremental lastmodified \
--merge-key id \
--check-column UPDATE_TIME \
--last-value "2019-03-06 00:00:00" \
;


7、導出HDFS數據到postgresql庫
(--update-mode模式有兩種updateonly(默認)和allowinsert
updateonly:用於同步Hive表與目標表中有更新過的記錄,對於新插入的記錄並不能同步到。
allowinsert:用於同步Hive表與目標表中有更新過的記錄,但同時也會同步新插入的記錄。)

sqoop export \
--connect jdbc:postgresql://192.168.66.94:5432/olc \
--username olc_admin \
--password old_admin114 \
--update-mode allowinsert \ (update-mode模式有兩種updateonly(默認)和allowinsert)
--table olc_inte_bid_plansign \
--fields-terminated-by '\001' \
--export-dir '/user/hive/dragonball/dragonball_tc_inte_bid_plansign.db/DRAGONBALL_TC_INTE_BID_PLANSIGN' \
--input-null-string '\\N' \
--input-null-non-string '\\N' \
;


8、eval執行一個SQL語句,並將結果展示出來在控制檯上
(在導出前常用來刪除目標表中數據,防止數據重複。也可以做更新或插入操作。)

sqoop eval \
--connect jdbc:postgresql://192.168.66.94:5432/olc \
--username olc_admin \
--password old_admin114 \
--query "delete from olc_inte_bid_plansign" \
;


9、創建Sqoop job
sqoop job \
--create myjob \
-- import \
--connect jdbc:oracle:thin:@192.168.30.220:1521/orcl_test \
--username NWD \
--password peYQrowG \
--table NWD.TC_INTE_BID_PLANSIGN \
--target-dir /user/hive/dragonball/dragonball_tc_inte_bid_plansign.db/DRAGONBALL_TC_INTE_BID_PLANSIGN/ \
--delete-target-dir \
--fields-terminated-by '\0x01' \
--compress \
--compression-codec org.apache.hadoop.io.compress.GzipCodec \
-m 4 \
;

sqoop job --list     查看sqoopjob列表
sqoop job --show myjob   查看某一job明細
sqoop job --exec myjob   執行job

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章