hive动态分区

来源:互联网 发布:语音域名 编辑:程序博客网 时间:2024/05/06 02:19

hive分区可以方便快速定位,查找( 设置分区,可以直接定位到hdfs上相应的文件目录下,避免全表扫描)。
hive分区可以分为静态分区、动态分区,另外静动态分区又都可以分为复合分区和单分区表。下面我们以动态复合分区为例,来记述一下分区的建立。

下面,让我们一起开始hive动态复合分区的冒险之旅吧!吼吼
基于hive1.1

1.建分区表

create  table scan_details(logTime string,logid string,tyopenId string,useragent string)partitioned by (ecodeId string,date string)STORED AS PARQUET

2.设置相关的参数

set hive.exec.dynamic.partition=true //使用动态分区set hive.exec.dynamic.partition.mode=nonstrick;//无限制模式,如果模式是strict,则必须有一个静态分区,且放在最前面set hive.exec.max.dynamic.partitions.pernode=10000;//每个节点生成动态分区的最大个数set hive.exec.max.dynamic.partitions=100000;//生成动态分区的最大个数set hive.exec.max.created.files=150000;//一个任务最多可以创建的文件数目set dfs.datanode.max.xcievers=8192;//限定一次最多打开的文件数set hive.merge.mapfiles=true; //map端的结果进行合并set mapred.reduce.tasks =20000;  //设置reduce task个数

3.进行数据插入

insert into scan_details partition(ecodeId,date) select logTime,logid,tyopenId,logid as ecodeId, logTime as date from testt2;注意:最后两个字段的名字需要跟动态分区字段的名字一致

4.注意:

1.外部表同样适用
2.若分区字段为空,也就是本例中logTime 为空
这里写图片描述

这里写图片描述

3.动态分区不允许主分区静态,从分区动态

hive> insert into scan_detailstest partition(ecodeId,date='12') values('a','aa','c','v','b');FAILED: SemanticException [Error 10094]: Line 1:39 Dynamic partition cannot be the parent of a static partition ''12''

4.如果分区是可以确定的话,千万不要用动态分区,动态分区相较与静态分区,效率会低一些。因为动态分区的值是在reduce运行阶段确定的,也就是会把所有的记录distribute by,而Distribute by 按指定字段,将数据划分到不同的Reduce中,所以当数据大的时候,Reduce的数量直接影响着效率的高低。

5.删除某一分区

ALTER TABLE  scan_detailstest  DROP IF EXISTS PARTITION (date='b');ALTER TABLE  scan_detailstest  DROP IF EXISTS PARTITION (date='b',country='us');

参考网址:

https://cwiki.apache.org/confluence/display/Hive/DynamicPartitions

0 0
原创粉丝点击