作者:Syn良子 出处:http://www.cnblogs.com/cssdongl/p/6831884.html 转载请注明出处

虽然之前已经用过很多次hive的分区表,但是还是找时间快速回顾总结一下加深理解.

举个栗子,基本需求就是Hive有一张非常详细的原子数据表original_device_open,而且还在不断随着时间增长,那么我需要给它进行分区,为什么要分区?因为我想缩小查询范围,提高速度和性能.

分区其实是物理上对hdfs不同目录进行数据的load操作,0.7之后的版本都会自动创建不存在的hdfs的目录,不同的目录对应不同的分区字段,当然会有一个处于最顶层的主分区字段.

我这里的分区字段主要是时间,分为年,月,日,时

首先建立一个新的分区表(这里我不在原始数据表直接操作)

  1. CREATE TABLE device_open (
  2. deviceid varchar(50),
  3. ...
  4. )
  5. PARTITIONED BY (year varchar(50),month varchar(50),day varchar(50),hour varchar(50))
  6. ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

然后我要从原始表中select数据插入到新建的分区表中去,如下采用动态插入(…代表省略的字段)

  1. set hive.exec.dynamic.partition=true;
  2. set hive.exec.dynamic.partition.mode=nonstrict;
  3. insert overwrite table device_open partition(year,month,day,hour)
  4. select
  5. ...,
  6. original_device_open.year as year,
  7. original_device_open.month as month,
  8. original_device_open.day as day,
  9. original_device_open.hour as hour
  10. FROM original_device_open

简单解释下

set hive.exec.dynamic.partition=true; 是开启动态分区

set hive.exec.dynamic.partition.mode=nonstrict; 这个属性默认值是strict,就是要求分区字段必须有一个是静态的分区值,随后会讲到,当前设置为nonstrict,那么可以全部动态分区

其他相关属性见下表

注意代码中标红的部分,partition(year,month,day,hour) 就是要动态插入的分区.

代码执行后一直卡在map百分比90%处,然后重试了都失败,查看后发现如下日志

Fatal error occurred when node tried to create too many dynamic partitions.

很明显的错误,太多动态分区了,因为 hive.exec.max.dynamic.partitions默认值是1000,而我这里的分区我确定肯定超过这个值了,那么修改如下

  1. set hive.exec.dynamic.partition=true;
  2. set hive.exec.dynamic.partition.mode=nonstrict;
  3. SET hive.exec.max.dynamic.partitions=100000;
  4. SET hive.exec.max.dynamic.partitions.pernode=100000;

重新执行insert分区代码,插入成功.

当然,对于大批量数据的插入分区,动态分区相当方便,对于小批量的分区插入,比如想定时每天执行某个时间段的分区数据插入,那也很简单,如下代码

  1. insert overwrite table device_open partition(year='2017',month='05',day,hour)
  2. select
  3. ...,
  4. original_device_open.day as day,
  5. original_device_open.hour as hour
  6. FROM original_device_open where original_device_open.year='2017' and original_device_open.month='05'

注意 partition(year='2017',month='05',day,hour)

我只需要指明需要静态分区的字段值就可以.剩下的字段就属于动态分区了,这里指将2017年5月份的数据插入分区表,对应底层的物理操作就是讲2017年5月份的数据load到

hdfs上对应2017年5月份下的所有day和hour目录中去.

Hive的静态分区和动态分区的更多相关文章

  1. Hive中静态分区和动态分区总结

    目录 背景 第一部分 静态分区 第二部分 动态分区 第三部分 两者的比较 第四部分 动态分区使用的问题 参考文献及资料 背景 在Hive中有两种类型的分区:静态分区(Static Partitioni ...

  2. 什么是hive的静态分区和动态分区,它们又有什么区别呢?hive动态分区详解

    面试官问我,什么是hive的静态分区和动态分区,这题我会呀. 简述 分区是hive存放数据的一种方式,将列值作为目录来存放数据,就是一个分区,可以有多列. 这样查询时使用分区列进行过滤,只需根据列值直 ...

  3. 对现有Hive的大表进行动态分区

    分区是在处理大型事实表时常用的方法.分区的好处在于缩小查询扫描范围,从而提高速度.分区分为两种:静态分区static partition和动态分区dynamic partition.静态分区和动态分区 ...

  4. 【HIVE】(2)分区表、二级分区、动态分区、分桶、抽样

    分区表: 建表语句中添加:partitioned by (col1 string, col2 string) create table emp_pt(id int, name string, job ...

  5. hive SQL 静态分区和 动态分区

    Hive 分区介绍: hive中简单介绍分区表(partition table),含动态分区(dynamic partition)与静态分区(static partition) hive中创建分区表没 ...

  6. Hive静态分区和动态分区

    一.静态分区 1.创建分区表 hive (default)> create table order_mulit_partition( > order_number string, > ...

  7. Hive静态分区和动态分区,对应Mysql中的元数据信息

    静态分区: 手动指定分区加载数据,就是常说的静态分区的使用.但是在日常工作中用的比较多的是动态分区. 创建: hive> create table order_mulit_partition( ...

  8. Hive Experiment 2(表动态分区和IDE)

    1.使用oracle sql developer 4.0.3作为hive query的IDE. 下载hive-jdbc driver http://www.cloudera.com/content/c ...

  9. hive学习(六) 参数和动态分区

    1.hive 参数.变量 1.1hive的命名空间: hive当中的参数.变量,都是以命名空间开头  

随机推荐

  1. Android TextView使用HTML处理字体样式、显示图片等

    一般情况下,TextView中的文本都是一个样式.那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及超级链接等属性呢?下面我们通过SpannableString的具体实例操 ...

  2. java的list集合如何根据对象中的某个字段排序?

    转自:http://blog.csdn.net/wangjuan_01/article/details/51351633 List集合按某个字段排序 package wjtest_01; import ...

  3. 类似hibernate实现sql增删改错

    Util package utils; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Ha ...

  4. jquery remove() detach() empty()三种方法的区别

    remove方法把事件删除掉了,数据并没有删除 detach方法保存了事件和数据 empty方法保留了元素本身,移除子节点,删除内容 举例: <!DOCTYPE html><html ...

  5. QQ空间的文艺打开方法

    QQ空间被限制?打不开? 看看这里 第一种:http://user.qzone.qq.com/627911903 第二种:http://627911903.qzone.qq.com 第三种:http: ...

  6. hibernate缓存,四种状态

    FlushMode.AUTO:Hibernate判断对象属性有没有改变,是默认的清理模式 FlushMode.COMMIT:在事务结束之前清理Session的缓存,其他任何时候都不清理缓存 Flush ...

  7. swift中类与结构体

    写了12个Person来复习,不过完成同样的代码需要敲键盘的次数相比OC确实少了很多,这很多应该归功于Swift中不写分号,以及少了OC中的中括号. 一.类与结构体 两者在Swift中差不了多少了 类 ...

  8. UIAlertAction 改变字体颜色

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:nil pre ...

  9. IBM DEVOPS IN CLOUD--chaos monkey

  10. Storm-源码分析-Topology Submit-Nimbus

    Nimbus Server Nimbus server, 首先从启动命令开始, 同样是使用storm命令"storm nimbus"来启动 看下源码, 此处和上面client不同, ...