关系型数据库(如Oracle)中,对分区表Insert数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中,Hive中也提供了类似的机制,即动态分区(Dynamic Partition),只不过,使用Hive的动态分区,需要进行相应的配置。

先看一个应用场景,源表t_lxw1234的数据如下:

[sql] view plain copy
  1. SELECT day,url FROM t_lxw1234;
  2. 2015-05-10 url1
  3. 2015-05-10 url2
  4. 2015-06-14 url1
  5. 2015-06-14 url2
  6. 2015-06-15 url1
  7. 2015-06-15 url2
  8. ……

目标表为:

[sql] view plain copy
  1. CREATE TABLE t_lxw1234_partitioned (
  2. url STRING
  3. ) PARTITIONED BY (month STRING,day STRING)
  4. stored AS textfile;

需求:将t_lxw1234中的数据按照时间(day),插入到目标表t_lxw1234_partitioned的相应分区中。

如果按照之前介绍的往指定一个分区中Insert数据,那么这个需求很不容易实现。

这时候就需要使用动态分区来实现,使用动态分区需要注意设定以下参数:

  • hive.exec.dynamic.partition

默认值:false

是否开启动态分区功能,默认false关闭。

使用动态分区时候,该参数必须设置成true;

  • hive.exec.dynamic.partition.mode

默认值:strict

动态分区的模式,默认strict,表示必须指定至少一个分区为静态分区,nonstrict模式表示允许所有的分区字段都可以使用动态分区。

一般需要设置为nonstrict

  • hive.exec.max.dynamic.partitions.pernode

默认值:100

在每个执行MR的节点上,最大可以创建多少个动态分区。

该参数需要根据实际的数据来设定。

比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数就需要设置成大于365,如果使用默认值100,则会报错。

  • hive.exec.max.dynamic.partitions

默认值:1000

在所有执行MR的节点上,最大一共可以创建多少个动态分区。

同上参数解释。

  • hive.exec.max.created.files

默认值:100000

整个MR Job中,最大可以创建多少个HDFS文件。

一般默认值足够了,除非你的数据量非常大,需要创建的文件数大于100000,可根据实际情况加以调整。

  • hive.error.on.empty.partition

默认值:false

当有空分区生成时,是否抛出异常。

一般不需要设置。

那么,上面的需求可以使用如下的语句来完成:

[sql] view plain copy
  1. SET hive.exec.dynamic.partition=true;
  2. SET hive.exec.dynamic.partition.mode=nonstrict;
  3. SET hive.exec.max.dynamic.partitions.pernode = 1000;
  4. SET hive.exec.max.dynamic.partitions=1000;
  5. INSERT overwrite TABLE t_lxw1234_partitioned PARTITION (month,day)
  6. SELECT url,substr(day,1,7) AS month,day
  7. FROM t_lxw1234;

注意:在PARTITION (month,day)中指定分区字段名即可;

在SELECT子句的最后两个字段,必须对应前面PARTITION (month,day)中指定的分区字段,包括顺序。

执行结果如下:

Loading data to table liuxiaowen.t_lxw1234_partitioned partition (month=null, day=null)

Loading partition {month=2015-05, day=2015-05-10}

Loading partition {month=2015-06, day=2015-06-14}

Loading partition {month=2015-06, day=2015-06-15}

Partition liuxiaowen.t_lxw1234_partitioned{month=2015-05, day=2015-05-10} stats: [numFiles=1, numRows=2, totalSize=10, rawDataSize=8]

Partition liuxiaowen.t_lxw1234_partitioned{month=2015-06, day=2015-06-14} stats: [numFiles=1, numRows=2, totalSize=10, rawDataSize=8]

Partition liuxiaowen.t_lxw1234_partitioned{month=2015-06, day=2015-06-15} stats: [numFiles=1, numRows=2, totalSize=10, rawDataSize=8]

使用show partitions t_lxw1234_partitioned;查看目标表有哪些分区:

hive> show partitions t_lxw1234_partitioned;

OK

month=2015-05/day=2015-05-10

month=2015-06/day=2015-06-14

month=2015-06/day=2015-06-15

最新文章

  1. Postgresql 数据库维护
  2. XiangBai——【AAAI2017】TextBoxes_A Fast Text Detector with a Single Deep Neural Network
  3. php使用ajax导出CSV或者EXCEl(thinkphp)方法
  4. IPsec 学习笔记
  5. SQL Server中TEXT类型字段值在数据库中追加字符串方法
  6. Oracle锁定和解锁用户的命令
  7. PCL中的类
  8. 原生js获取样式
  9. 建立第一个OpenGL工程(GLUT)
  10. (转载)使用JavaScript操作表单
  11. Xcode4快速Doxygen文档注释 — 简明图文教程
  12. 数据挖掘经典算法之KNN
  13. 201521123074 《Java程序设计》第2周学习总结
  14. C#使用互斥量(Mutex)实现多进程并发操作时进程间的同步操作(进程同步)
  15. react-踩坑记录——Link带参数跳转后this.props为空对象
  16. spring和springmvc配置分离
  17. python中enumerate内置库的使用
  18. UVa 10828 Back to Kernighan-Ritchie (数学期望 + 高斯消元)
  19. 03-03 java 顺序语句结构,选择结构if语句
  20. SQL2005中的事务与锁定(九)-(1)- 转载

热门文章

  1. 7.18 collection time random os sys 序列化 subprocess 等模块
  2. Selenium+java - Page Object设计模式
  3. Zabbix-Web监控介绍篇
  4. Example With JdbcDaoSupport
  5. Windows下如何使用Tensorflow Object Detection API
  6. Android P不能使用http
  7. The used SELECT statements have a different number of columns???
  8. Linux下各目录及其作用
  9. HDU 6040
  10. java web基础 js、JSP、servlet之间的传递