静态分区:

在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

sqoop导oracle数据到hive中并动态分区的更多相关文章

  1. sqoop 从oracle导数据到hive中,date型数据时分秒截断问题

    oracle数据库中Date类型倒入到hive中出现时分秒截断问题解决方案 1.问题描述: 用sqoop将oracle数据表倒入到hive中,oracle中Date型数据会出现时分秒截断问题,只保留了 ...

  2. sqoop将oracle数据导入hdfs集群

    使用sqoop将oracle数据导入hdfs集群 集群环境: hadoop1.0.0 hbase0.92.1 zookeeper3.4.3 hive0.8.1 sqoop-1.4.1-incubati ...

  3. hdfs数据到hive中,以及hdfs数据隐身理解

    hdfs数据到hive中: 假设hdfs中已存在好了数据,路径是hdfs:/localhost:9000/user/user_w/hive_g2park/user_center_enterprise_ ...

  4. 使用sqoop把mysql数据导入hive

    使用sqoop把mysql数据导入hive export HADOOP_COMMON_HOME=/hadoop export HADOOP_MAPRED_HOME=/hadoop   cp /hive ...

  5. sqoop1.4.4从oracle导数据到hive中

    sqoop从oracle定时增量导入数据到hive 感谢: http://blog.sina.com.cn/s/blog_3fe961ae01019a4l.htmlhttp://f.dataguru. ...

  6. 使用Sqoop,最终导入到hive中的数据和原数据库中数据不一致解决办法

            Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL , ...

  7. 使用sqoop1.4.4从oracle导入数据到hive中错误记录及解决方案

    在使用命令导数据过程中,出现如下错误 sqoop import --hive-import --connect jdbc:oracle:thin:@192.168.29.16:1521/testdb ...

  8. python脚本 用sqoop把mysql数据导入hive

    转:https://blog.csdn.net/wulantian/article/details/53064123 用python把mysql数据库的数据导入到hive中,该过程主要是通过pytho ...

  9. sqoop 导入增量数据到hive

    版本 hive:apache-hive-2.1.0 sqoop:sqoop-1.4.6 hadoop:hadoop-2.7.3 导入方式 1.append方式 2.lastmodified方式,必须要 ...

随机推荐

  1. LoRaWAN Server开源项目部署

    1,安装MQTT broker,Redis,PostgreSQL sudo apt install mosquitto mosquitto-clients redis-server redis-too ...

  2. 开源题材征集 + MVC&EF Core 完整教程小结

    到目前为止,我们的MVC+EF Core 完整教程的理论部分就全部结束了,共20篇,覆盖了核心的主要知识点. 下一阶段是实战部分,我们将会把这些知识点串联起来,用10篇(天)来完成一个开源项目. 现向 ...

  3. 构建docker虚拟化平台

    安装epel-release扩展包 yum install epel-release -y 安装docker yum install docker-ce 启动docker systemctl star ...

  4. 打造适用于c#的feign

    之前因为工作原因使用spring cloud全家桶开发过若干项目,发现其中的feign非常好用,以前开发接口客户端的时候都是重复使用HttpClient实现业务,每次新增接口都十分繁琐,故萌生了自定义 ...

  5. 原生js实现的一个随机颜色的简单效果

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta na ...

  6. 设计模式(C#)——02工厂模式

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321       在简单工厂模式中讲到简单工厂模式的缺点:难以扩展,一旦添加新运算就必须修改简单工厂方法.       工厂方法模式: ...

  7. Delphi - 创建text文件并添加数据到文件中

    创建文本文件 代码如下: //创建一个文本文件 procedure CreateTextFile(); var AssignFile(TF,'C:\tmp\1.txt'); ReWrite(TF); ...

  8. CodeForces 103D Time to Raid Cowavans 询问分块

    Time to Raid Cowavans 题意: 询问 下标满足 a + b * k 的和是多少. 题解: 将询问分块. 将b >= blo直接算出答案. 否则存下来. 存下来之后,对于每个b ...

  9. Covered Points Count CF1000C 思维 前缀和 贪心

     Covered Points Count time limit per test 3 seconds memory limit per test 256 megabytes input standa ...

  10. 【JavaScript】ESlint & Prettier & Flow组合,得此三神助,混沌归太清

    Flow Flow的意义 Flow是faceBook开源的一个JavaScript静态类型检查工具,作用类似TypeScript,但是它不像TS那样是一门独立的语言,而是作为一个babel-plugi ...