您的位置:首页 > 数据库 > Oracle

sqoop导oracle数据到hive中并动态分区

2018-08-23 18:12 246 查看

静态分区:

在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://www.geek-share.com/detail/2542779528.html

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

https://www.geek-share.com/detail/2705324302.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: