我们在业务中往往会遇到一种情况就是:
现有的业务已经有很多的数据堆积,并且需要根据现有的数据以分区的形式来建立数据仓库,这样的话就需要将表中的一个字段作为分区字段,以这个字段的值作为分区的依据。
那么就需要动态分区进行处理:
首先需要设置参数:
-- 表示开启动态分区功能 (默认false)
set hive.exec.dynamic.partition =true
--(默认strict),表示允许所有分区都是动态的,否则必须有静态分区字段
set hive.exec.dynamic.partition.mode = nonstrict
然后是可以调整的参数:(在这里遇到过坑,分区数太多,超出默认限制)
set hive.exec.max.dynamic.partitions.pernode=100 (默认100,一般可以设置大一点,比如1000)
表示每个maper或reducer可以允许创建的最大动态分区个数,默认是100,超出则会报错。
set hive.exec.max.dynamic.partitions =1000(默认值)
表示一个动态分区语句可以创建的最大动态分区个数,超出报错
set hive.exec.max.created.files =10000(默认) 全局可以创建的最大文件个数,超出报错。
设置完参数之后,将原有的数据映射成临时表,将所有的字段映射进去,包括分区的字段。
然后设置分区表,跟临时表少了一个字段,就是分区的字段,
然后插入分区表,注意bdp_day是分区字段,在临时表中的最后需要查询出来,然后默认以临时表的最后一个字段作为分区字段,插入数据。
insert overwrite table ods_release.ods_01_release_session partition(bdp_day)
select
rel.release_session,
rel.release_status,
rel.device_num,
rel.device_type,
rel.sources,
rel.channels,
from_unixtime(rel.ct,'HH'),
from_unixtime(rel.ct,'yyyy-MM-dd HH:mm:ss'),
from_unixtime(rel.ct,'yyyy-MM-dd') as bdp_day
from
ods_release.ods_01_release_session_tmp rel
这样就将bdp_day的值作为分区的值,分成多个分区存储,也就是在hdfs中分成了多个目录进行存储。

本文介绍了在大数据场景下如何使用Hive实现全自动动态分区。通过设置参数如hive.exec.max.dynamic.partitions.pernode和hive.exec.max.dynamic.partitions,解决分区过多导致的错误。将原有数据映射为临时表,创建缺少分区字段的分区表,然后利用临时表的最后一个字段作为分区依据进行插入,从而实现按bdp_day字段值动态分区存储。
3684

被折叠的 条评论
为什么被折叠?



