代码之家  ›  专栏  ›  技术社区  ›  Micah Pearce

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

  •  0
  • Micah Pearce  · 技术社区  · 7 年前

    我看到以下两个属性成对出现。他们之间有什么区别?

     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; 我还需要知道什么才能选择使用哪一种。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Ged    7 年前

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

    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
    

    否则,您需要这样做,自己设置分区列/explicity:

    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 是否有防止用户 意外覆盖所有分区,即避免数据丢失。

    因此,这不是一种不同的情况,而是一种谨慎的情况,一种类似于枪支上的安全扣的情况。

    推荐文章