【问题标题】:databricks overwriting entire table instead of adding new partitiondatabricks 覆盖整个表而不是添加新分区
【发布时间】:2022-01-12 14:56:03
【问题描述】:

我有这张桌子

CREATE TABLE `db`.`customer_history` (
  `name` STRING,
  `addrress` STRING, 
  `filename` STRING,
  `dt` DATE)
USING delta
PARTITIONED BY (dt)

当我使用它来将分区数据加载到表中时

      df
    .write
    .partitionBy("dt")
    .mode("overwrite")
    .format("delta")
    .saveAsTable("db.customer_history")

由于某种原因,它会覆盖整个表。我认为覆盖模式只会覆盖分区数据(如果存在)。我的理解正确吗?

【问题讨论】:

    标签: apache-spark databricks delta


    【解决方案1】:

    Delta 可以使用replaceWhere 选项轻松更新某些磁盘分区。您可以像这样选择性地仅覆盖与分区列上的谓词匹配的数据,

    dataset.write.repartition(1)\
           .format("delta")\
           .mode("overwrite")\
           .partitionBy('Year','Week')\
           .option("replaceWhere", "Year == '2019' AND Week >='01' AND Week <='02'")\ #to avoid overwriting Week3
           .save("\curataed\dataset")
    

    注意:当您必须运行计算量大的算法时,replaceWhere 特别有用,但仅限于某些分区'

    您可以参考:link

    【讨论】:

      【解决方案2】:

      要覆盖单个分区,请使用:

      df
        .write 
        .format("delta") 
        .mode("overwrite") 
        .option("replaceWhere", "dt >= '2021-01-01'") 
        .save("data_path")
      
      

      【讨论】:

        猜你喜欢
        • 2021-11-10
        • 2021-12-19
        • 1970-01-01
        • 2021-06-30
        • 1970-01-01
        • 2018-12-13
        • 2013-05-04
        • 2021-02-20
        • 2020-11-02
        相关资源
        最近更新 更多