靜態分區:
在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