hive动态分区

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shengjk1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值