首页 > 解决方案 > dynamic.partition=True 和 dynamic.partition.mode = nonstrict 有什么区别?

问题描述

火花 2.0 - pyspark

我看到以下 2 个属性配对。它们之间有什么区别?

 hive> SET hive.exec.dynamic.partition=true;
 hive> SET hive.exec.dynamic.partition.mode=non-strict;

我知道使用它们时的结果是什么——您可以使用动态分区来加载/创建多个分区,但我不知道这两个类似命令之间的区别。

当我运行这段代码时

input_field_names=['id','code','num']
df \
.select(input_field_names) \
.write \
.mode('append')\
.insertInto('test_insert_into_partition')

我收到一条错误消息,上面写着Dynamic partition strict mode requires at least one static partition column. To turn this off set hive.exec.dynamic.partition.mode=nonstrict

使用spark.sql("SET hive.exec.dynamic.partition.mode = nonstrict")代码有效。它不需要我使用另一个。

为什么我不需要设置SET hive.exec.dynamic.partition=true;,我还应该知道什么来选择使用哪一个。

标签: apache-sparkhive

解决方案


虽然谷歌有很多东西,但这里有一个简短的答案。

如果要动态插入 Hive 分区,则需要设置两个值,然后可以一次性加载多个分区:

SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict

create table tblename (h string,m string,mv double,country string)partitioned by (starttime string) location '/.../...'

INSERT overwrite table tblename PARTITION(starttime) SELECT h,m,mv,country,starttime from tblename2

否则,您需要这样做,自己/明确设置分区 col val:

INSERT into table tblename PARTITION(starttime='2017-08-09') SELECT h,m,mv,country from tblname2 where to_date(starttime)='2017-08-09'

hive.exec.dynamic.partition.mode的默认值 'strict' 的 目的是防止用户意外覆盖所有分区,即避免数据丢失。

因此,没有区别的情况,而是谨慎的情况,但就像枪支上的保险装置一样。


推荐阅读