dynamic.partition = True和dynamic.partition.mode = nonstrict有什么区别?

时间:2019-01-09 18:35:47

标签: apache-spark hive

Spark 2.0-pyspark

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

{ "state" : "created", "_id" : 6 }
{ "state" : "changed", "_id" : 5 }
{ "state" : "deleted", "_id" : 3 }

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

当我运行这段代码时

 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")以及选择使用哪个我还要知道些什么。

1 个答案:

答案 0 :(得分:1)

尽管Google有很多东西,但这是一个简短的答案。

如果要动态插入到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

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

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

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

因此,没有区别的情况,而是谨慎的情况,但是就像枪支上的安全钩一样。