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
相关文章推荐
- 使用Sqoop将Oracle数据导入Hive
- Sqoop将MySQL和Oracle的数据导入HIVE和Hbase
- 利用sqoop从mysql向多分区hive表中导入数据
- Sqoop工具使用(一)--从oracle导入数据到hive
- hive从查询中获取数据插入到表或动态分区
- hive导入CSV数据,使用动态分区重新分区
- 运用sqoop将数据从oracle导入到hive中的注意的问题
- hive向动态分区插入数据
- 016-Hadoop Hive sql语法详解6-job输入输出优化、数据剪裁、减少job数、动态分区
- Hive 视图 索引 动态分区装载数据
- Hive通过动态分区装载数据
- 通过sqoop导入Oracle数据到Hive时异常.IOException: Cannot run program "hive": error=2, No such file or directory
- hive从查询中获取数据插入到表或动态分区
- Sqoop将数据从oracle导入到hive时,数据错位问题
- [置顶] hive 动态加载数据到指定分区,以及其他hive使用的技巧
- sqoop 从oracle到hive数据错位,并产生很多null值,clob类型被截取成一小段一小段
- 利用sqoop 将 hive/hdfs数据 导入 Oracle中
- 利用sqoop导出hive数据到 oracle
- 用sqoop将oracle数据导入Hive
- 利用Sqoop把Oracle数据迁移到HDFS、Hive