sqoop導oracle數據到hive中並動態分區


靜態分區:

在hive中創建表可以使用hql腳本:

test.hql

USE TEST;
CREATE TABLE page_view(viewTime INT, userid BIGINT,
     page_url STRING, referrer_url STRING,
     ip STRING COMMENT 'IP Address of the User')
 COMMENT 'This is the page view table'
 PARTITIONED BY(dt STRING)
 STORED AS SEQUENCEFILE;

注意,分區字段不能與表中的字段重復,不然會執行出錯

執行hql腳本:

$ hive -f test.hql

手動添加分區:

hive> ALTER TABLE page_view add PARTITION (dt=2018)

創建好分區后,hive會在HDFS存儲中創建相應的路徑:

$ hadoop fs -ls /user/hive/warehouse/page_view
drwxr-xr-x - admin supergroup 0 2011-07-29 09:53 /user/hive/warehouse/page_view/dt=2018

或者使用

hive> dfs -ls /user/hive/warehouse/page_view

使用sqoop腳本導入數據:

sqoop_test.sh

#!/bin/sh

sqoop import 	                                        \
--connect jdbc:oracle:thin:@127.0.0.1:1521:orcl         \
--username test                                         \
--password 123456                                       \
--columns "viewTime,userid,page_url,referrer_url,ip"    \
--hive-partition-key "dt"                               \
--hive-partition-value "2018"                           \
--query "SELECT viewTime,userid,page_url,referrer_url,ip from page_view  WHERE 1=1 and \$CONDITIONS" \
--hive-table test.page_view                             \
--hive-drop-import-delims                               \ 
--target-dir "/data/test/page_view"                     \
--hive-overwrite                                        \
--null-string '\\N'                                     \
--null-non-string '\\N'                                 \
--hive-import;

在使用sqoop導入數據的時候可以指定分區,但是--hive-partition-key--hive-partition-value選項只能指定一個參數,可以使用--hcatalog-partition-keys--hcatalog-partition-values選項指定多個分區字段,用逗號分隔。

動態分區:

​ 手動分區靈活性太低,當分區數較多的時候一個個分區單獨去加載數據的話工作量太大,這時候可以考慮動態分區。動態分區是基於hive中的源數據表將數據插入到分區表中,在數據插入的時候會根據分區字段自動將數據歸類存入對應的分區路徑,而不需要手動指定分區路徑。要使用動態分區必須要先開啟動態分區:

hive> SET hive.exec.dynamic.partition=true;  
hive> SET hive.exec.dynamic.partition.mode=nonstrict; 
hive> SET hive.exec.max.dynamic.partitions.pernode=1000;

然后創建一張沒有分區字段的源數據表(與分區字段對應的字段放后面,與分區表的保持一致):

USE TEST;
CREATE TABLE original_page_view(viewTime INT, userid BIGINT,
     page_url STRING, referrer_url STRING,
     ip STRING COMMENT 'IP Address of the User',
     dt STRING COMMENT 'view date')
 COMMENT 'This is the page view table'
 STORED AS SEQUENCEFILE;

並使用sqoop腳本從oracle導入數據到表original_page_view

original_sqoop_test.sh

#!/bin/sh

sqoop import 	                                        \
--connect jdbc:oracle:thin:@127.0.0.1:1521:orcl         \
--username test                                         \
--password 123456                                       \
--columns "viewTime,userid,page_url,referrer_url,ip,dt"    \
--query "SELECT viewTime,userid,page_url,referrer_url,ip,dt from page_view  WHERE 1=1 and \$CONDITIONS" \
--hive-table test.original_page_view                             \
--hive-drop-import-delims                               \ 
--target-dir "/data/test/page_view"                     \
--hive-overwrite                                        \
--null-string '\\N'                                     \
--null-non-string '\\N'                                 \
--hive-import;

數據導入完畢后,執行如下語句即可將original_page_view中的數據導入到page_view並自動分區:

hive> insert overwrite table page_view partition(dt) select * from original_page_view;

查看分區情況:

hive> dfs -ls /user/hive/warehouse/page_view

相關參數說明:

名稱 默認值 描述
hive.exec.dynamic.partition false 是否開啟動態分區功能,默認false關閉,使用動態分區時候,該參數必須設置成true
hive.exec.dynamic.partition.mode strict 動態分區的模式,默認strict,表示必須指定至少一個分區為靜態分區,nonstrict模式表示允許所有的分區字段都可以使用動態分區, 一般需要設置為nonstrict
hive.exec.max.dynamic.partitions.pernode 100 在每個執行MR的節點上,最大可以創建多少個動態分區。該參數需要根據實際的數據來設定。
hive.exec.max.dynamic.partitions 1000 在所有執行MR的節點上,最大一共可以創建多少個動態分區。
hive.exec.max.created.files 10w 整個MR Job中,最大可以創建多少個HDFS文件
hive.error.on.empty.partition false 當有空分區生成時,是否拋出異常

參考鏈接:

https://community.hortonworks.com/questions/43982/sqoop-insert-into-partitioned-table.html

https://blog.csdn.net/jiedushi/article/details/7356015

https://www.cnblogs.com/charlist/p/7122113.html

http://www.cnblogs.com/cssdongl/p/6831884.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM