[原创]hive中的分区,动态分区和静态分区

原创,转载请注明出处 http://blog.csdn.net/baishuo491/article/details/39857885  作者  亚信科技大数据平台中心  白硕

分区是hive在处理大型表时常用的方法。分区(partition)在hive的物理存储中,体现为表名下的某个目录,这个目录下存储着这个分区下对应的数据。分区的好处在于缩小查询扫描范围,从而提高速度。分区分为两种:静态分区static partition和动态分区dynamic partition。静态分区和动态分区的区别在于导入数据时,是手动输入分区名称,还是通过数据来判断数据分区。对于大数据批量导入来说,显然采用动态分区更为简单方便。


先看一个没有分区的表:

create table dyn_part_src_spark
(name_src string,
score_src string,
grade_src string,
class_src string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

我们可以把相应的数据装在到dyn_part_src_spark这个表中

LOAD DATA LOCAL INPATH '{你自己的路径}/testpartition_2.txt'

testpartition_2.txt的内容可以是这样的:

name1,11,grade1,class1
name2,22,grade1,class1
name3,33,grade1,class2
name4,44,grade1,class2
name5,55,grade2,class1
name6,66,grade2,class1
name7,77,grade2,class2
name8,88,grade2,class2

装载数据完毕之后

可以去hdfs上查看目录/user/hive/warehouse/dyn_part_src_spark ,可以看到刚才导入的数据都在这个目录下,因为这是个没有分区的表

分区表的是这样被建立的:

create table dyn_part_test_spark
(name string,
score string
)
partitioned by (
grade string,
class string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

在装载数据后,分区的列grade和class以及它们对应的值会被拼接成为/user/hive/warehouse/dyn_part_test_spark 目录下的若干个子目录

先来看一个静态态分区的例子,执行下面的语句,注意partition关键字后面,grade和class的值都是指定的。

insert overwrite table dyn_part_test_spark partition(grade='grade1',class='class1')
select name_src,score_src,class_src
from dyn_part_src_spark
where grade_src='grade2'and class_src='class2';

执行语句成功后,打开/user/hive/warehouse/dyn_part_test_spark 目录,会发现一个grade=grade1目录,里面还有一个目录class=class1,对应的数据就存放在这个目录下面。

分区的作用很明显,当以指定的分区列作为查询条件的时候,hive会通过分区列和指定的值快速的确定要扫描的目录,大大加快了查询的数据。

但是静态分区有一个很大的问题,要求在partition关键字后面,对应分区列的值要被指定的。当分区列的值有很多个的时候,就需要重复执行很多次类似的insert语句。例如,在testpartition_2.txt 中,grade和class的值得组合就有四种(grade=grade1/class=class1;grade=grade1/class=class2;grade=grade2/class=class1;grade=grade2/class=class2)。为了解决这个问题,hive提出了动态分区的技术。

执行如下语句:

1)set hive.exec.dynamic.partition.mode=nonstrict;

注意自行下面语句的时候,partition关键字后面的grade和class都没有指定具体的值

2) insert overwrite table dyn_part_test_spark partition(grade,class)
select name_src,score_src,grade_src,class_src
from dyn_part_src_spark;

执行成功后,打开/user/hive/warehouse/dyn_part_test_spark 目录,发现里面的子目录是这样组织的

两个一级子目录grade=grade1和grade=grade2,在这两个子目录下面,分别存在两个二级子目录class=class1和class=class2,对应的数据分别存在对应的子目录下。

可见,通过动态分区技术,不但可以一次导入数据,而且同时能够根据源数据中不同的分区列的值,动态的生成对应的目录,并把对应的数据写入对应的目录中

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值