apache-spark - 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;
,我还应该知道什么来选择使用哪一个。
解决方案
虽然谷歌有很多东西,但这里有一个简短的答案。
如果要动态插入 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' 的 目的是防止用户意外覆盖所有分区,即避免数据丢失。
因此,没有区别的情况,而是谨慎的情况,但就像枪支上的保险装置一样。
推荐阅读
- angular - 社交媒体的 Angular Meta 标签无法抓取
- git - Git - 查找带有以开头的标签的修订
- javascript - 如果更新了原始数组,地图会自动更新吗?
- c++ - 为什么将虚函数隐藏在非虚等号后面
- python - Savefig 以与给定大小不同的大小保存图像
- c++ - 带有类型推导的构造函数中的通用引用
- amazon-web-services - 如何使用无服务器模板将 lambda 当前/执行版本转换为环境变量
- python - 我如何在python unittest中使用for循环运行单个python测试用例执行不同的输入/输出
- firebase - 代理和防火墙后面的 Firebase 移动通知(在公司 LAN 中)
- xamarin - Xamarin InAppBilling 订阅