💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # 配置 关系型数据库中,对分区表insert数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中,hive中也提供了类似的机制,即动态分区(Dynamic Partition),只不过,使用hive的动态分区,需要进行相应的配置 开启动态分区参数设置 * 开启动态分区功能(默认true,开启) ~~~ hive.exec.dynamic.partition=true ~~~ * 设置为非严格模式(动态分区的模式,默认strict,表示必须指定至少一个分区为静态分区, nonstrict模式表示允许所有的分区字段都可以使用动态分区) ~~~ hive.exec.dynamic.partition.mode=nonstrict ~~~ * **在所有执行MR的节点上**,最大一个节点可以创建多少个动态分区 ~~~ hive.exec.max.dynamic.partitions=1000 ~~~ * **在每个执行MR的节点上**,最大可以创建多少动态分区.该参数需要根据实际的数据来设定.比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数就需要设置成大于365,如果使用默认值100,则会报错 ~~~ hive.exec.max.dynamic.partitions.pernode=100 ~~~ * 整个MR Job中,最大可以创建多少个HDFS文件 ~~~ hive.exec.max.created.files=100000 ~~~ * 当有空分区生成时,是否抛出异常.一般不需要设置 ~~~ hive.error.on.empty.partition=false ~~~ # 案例 将ori中的数据按照时间(如:2011123000008),插入到目标表`ori_partitioned_target`的相应分区中 1. 创建分区表 ~~~ create table ori_partitioned(id bigint, time bigint, uid string, keyword string, url_rank int, click_num int, click_url string) partitioned by (p_time bigint) row format delimited fields terminated by '\t'; ~~~ 2. 加载数据到分区表中 ~~~ hive> load data local inpath '/root/ds1' into table ori_partititoned partition(p_time='2011123000008'); hive> load data local inpath '/root/ds2' into table ori_partititoned partition(p_time='2011123000011'); ~~~ 3. 创建目标分区表 ~~~ create table ori_partitioned_target(id bigint, time bigint, uid string, keyword string, url_rank int, click_num int, click_url string) partitioned by(p_time string) row format delimited fields terminated by '\t'; ~~~ 4. 设置动态分区 ~~~ set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstrict; set hive.exec.max.dynamic.partitions=1000; set hive.exec.max.dynamic.partitions.pernode=100; set hive.exec.max.created.files=100000; hive> insert overwrite table ori_partitioned_target partition(p_time) select id,time, uid,keyword, url_rank, click_num, click_url, p_time from ori_partitioned; ~~~ 5. 查看目标分区表的分区情况 ~~~ hive> show partitions ori_partitioned_target; ~~~