hive-动态分区Dynamic Partition

com

往分区表插数据时,需要指定分区。这样一次只能插入一个分区。
如果插入数据分散在多个分区中,就要通过动态分区功能,自动创建分区并填充。

hive中支持两种类型的分区:

静态分区SP(static partition)
动态分区DP(dynamic partition)

静态分区与动态分区的主要区别在于静态分区是手动指定,而动态分区是通过数据来进行判断。详细来说,静态分区的列是在编译时期,通过用户传递来决定的;动态分区只有在SQL执行时才能决定。

参数配置

set hive.exec.dynamic.partition=true;–是否允许动态分区

默认值:false
是否开启动态分区功能,默认false关闭。
使用动态分区时候,该参数必须设置成true。

set hive.exec.dynamic.partition.mode=nonstrict; --分区模式设置

默认值:strict
动态分区的模式,默认strict,表示必须指定至少一个分区为静态分区。
nonstrict模式:表示允许所有的分区字段都可以使用动态分区。

set hive.exec.max.dynamic.partitions.pernode=1000;–单个节点上的mapper/reducer允许创建的最大分区

默认值:100
在每个执行MR的节点上,最大可以创建多少个动态分区。该参数需要根据实际的数据来设定。
比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数就需要设置成大于365,如果使用默认值100,则会报错。

set hive.exec.max.dynamic.partitions=1500;–允许动态分区的最大数量

默认值:1000
在所有执行MR的节点上,最大一共可以创建多少个动态分区。
同上参数解释。

hive.exec.max.created.files=100000;–一个mapreduce作业能创建的HDFS文件最大数

默认值:100000
整个MR Job中,最大可以创建多少个HDFS文件。
一般默认值足够了,除非你的数据量非常大,需要创建的文件数大于100000,可根据实际情况加以调整。

此处补充知识点:使用动态分区可能遇到分区文件数超10万的情况,解决办法参考distribute by控制分区文件数

hive.error.on.empty.partition=false;–在动态分区插入产生空结果时是否抛出异常

默认值:false
当有空分区生成时,是否抛出异常。一般不需要设置。

case

set hive.exec.dynamic.partition = true;
set hive.exec.dynamic.partition.mode = nonstrict;
insert overwrite table t_part partition(year,month)
select id,name,orderdate,substring(orderdate,1,4),substring(orderdate,6,2) from t_temp;
--自动创建分区并填充
--动态分区在insert数据的时候,分区字段要放在插入字段的最后面,同时要和指定的分区字段的顺序一致

日志:

Loading data to table test_neil.t_part partition (year=null, month=null)
     Time taken for load dynamic partitions : 651
    Loading partition {year=2016, month=12}
    Loading partition {year=2017, month=01}
    Loading partition {year=2016, month=11}
     Time taken for adding to write entity : 1
Partition test_neil.t_part{year=2016, month=11} stats: [numFiles=1, numRows=5, totalSize=97, rawDataSize=92]
Partition test_neil.t_part{year=2016, month=12} stats: [numFiles=1, numRows=11, totalSize=210, rawDataSize=199]
Partition test_neil.t_part{year=2017, month=01} stats: [numFiles=1, numRows=2, totalSize=43, rawDataSize=41]

notice

1、尽量不要用动态分区,因为动态分区的时候,将会为每一个分区分配reducer数量,当分区数量多的时候,reducer数量将会增加,对服务器是一种灾难。
2、动态分区和静态分区的区别,静态分区不管有没有数据都将会创建该分区,动态分区是有结果集将创建,否则不创建。
3、hive动态分区的严格模式和hive提供的hive.mapred.mode的严格模式。
hive提供我们一个严格模式:为了阻止用户不小心提交恶意hql
hive.mapred.mode=nostrict : strict
如果该模式值为strict,将会阻止以下三种查询:
(1)对分区表查询,where中过滤字段不是分区字段。
(2)笛卡尔积join查询,join查询语句,不带on条件或者where条件。
(3)对order by查询,有order by的查询不带limit语句。
4、动态分区不允许主分区采用动态列而副分区采用静态列,这样将导致所有的主分区都要创建副分区静态列所定义的分区。
5、动态分区可以允许所有的分区列都是动态分区列,但是要首先设置一个参数:hive.exec.dynamic.partition.mode。
6、注意!!!
hive用了动态分区,若select语句无数据,则insert overwrite并不会覆盖。因为动态分区由select决定,select语句无数据,分区也无法确定,故无法实现动态覆盖。此时想要修正表数据,需要手动删除该分区。

ALTER TABLE pdata_ams.check_deposit_flow_day DROP IF EXISTS PARTITION(busi_date='2022-03-09');
### Hive内部分区表的概念及其实现 #### 分区表的核心概念 Hive中的分区表是一种用于优化大数据查询的技术。它通过将数据按照某个或某些列的值划分为不同的子集,从而使得查询操作更加高效[^2]。这种技术允许用户仅加载特定条件下的数据,而不是扫描整个表格的内容。 #### 动态分区功能 为了支持更灵活的数据插入方式,Hive引入了动态分区的功能。启用此功能需要设置参数`hive.exec.dynamic.partition=true`[^1]。这样,在向分区表中插入数据时,Hive可以根据实际数据内容自动生成对应的分区路径并保存数据[^3]。 #### 创建分区表的具体方法 以下是创建一个基于日期字段(`day`)进行分区的表的例子: ```sql CREATE TABLE dept_partition ( deptno INT, -- 部门编号 dname STRING, -- 部门名称 loc STRING -- 部门位置 ) PARTITIONED BY (day STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; ``` 上述SQL语句定义了一个名为`dept_partition`的表,并指定了按字符串类型的`day`字段进行分区[^4]。 #### 向分区表写入数据的方式 对于已经创建好的分区表,可以通过多种方式进行数据填充。其中一种常见的方式是使用`LOAD DATA`命令直接导入文件到指定的分区目录下;另一种则是利用`INSERT INTO ... PARTITION (...) SELECT ... FROM ...`结构完成复杂场景下的数据迁移工作。 #### 使用分区表的优势分析 采用分区策略不仅有助于加快查询速度,还便于日常维护以及实施长期存档计划等方面的工作。当面对海量记录集合时,合理设计分区方案往往能带来显著效益改进效果[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值