【问题标题】:Write spark Dataframe to an exisitng Delta Table by providing TABLE NAME instead of TABLE PATH通过提供 TABLE NAME 而不是 TABLE PATH 将 spark Dataframe 写入现有的 Delta 表
【发布时间】:2022-01-04 22:56:41
【问题描述】:

我正在尝试将 spark 数据帧写入现有的增量表。

我确实有多种情况可以将数据保存到不同的表中,如下所示。

场景-01:

我有一个现有的增量表,我必须使用选项mergeSchema 将数据帧写入该表,因为每次加载时架构可能会发生变化。

我通过提供增量表 path

对以下命令执行相同的操作
finalDF01.write.format("delta").option("mergeSchema", "true").mode("append") \
  .partitionBy("part01","part02").save(finalDF01DestFolderPath)

只想知道这是否可以通过提供现有的 delta TABLE NAME 而不是 delta PATH 来完成。

已通过如下更新数据写入命令解决此问题。

finalDF01.write.format("delta").option("mergeSchema", "true").mode("append") \
  .partitionBy("part01","part02").saveAsTable(finalDF01DestTableName)
  1. 这是正确的方法吗?

场景 02:

如果记录已经存在并且不插入新记录,我必须更新现有表。 为此,我目前正在做如下所示。

spark.sql("SET spark.databricks.delta.schema.autoMerge.enabled = true") 
DeltaTable.forPath(DestFolderPath)
   .as("t")
   .merge(
      finalDataFrame.as("s"),
         "t.id = s.id AND t.name= s.name")
       .whenMatched().updateAll()
       .whenNotMatched().insertAll()
   .execute()

我尝试了以下脚本。

destMasterTable.as("t")
      .merge(
         vehMasterDf.as("s"),
          "t.id = s.id")
       .whenNotMatched().insertAll()
       .execute()

但低于错误(即使使用alias 而不是as)。

error: value as is not a member of String
    destMasterTable.as("t")
  1. 这里我也使用 delta 表路径作为目标,有什么方法可以提供 delta TABLE NAME 而不是 TABLE PATH

最好提供TABLE NAME而不是TABLE PATH,以防我们以后更改表路径不会影响代码。 我在databricks 文档中没有看到任何地方提供表名以及mergeSchemaautoMerge。 有可能吗?

【问题讨论】:

    标签: apache-spark apache-spark-sql databricks delta-lake


    【解决方案1】:

    要将现有数据用作表而不是路径,您要么需要从一开始就使用 saveAsTable,要么只需使用 SQL 命令 CREATE TABLE USING 在 Hive 元存储中注册现有数据,就像这样(语法可能稍微取决于您是在 Databricks 上运行,还是在 OSS Spark 上运行,并且取决于 Spark 的版本):

    CREATE TABLE IF NOT EXISTS my_table
    USING delta
    LOCATION 'path_to_existing_data'
    

    之后,您可以使用saveAsTable

    对于第二个问题 - 看起来 destMasterTable 只是一个 String。要引用现有表,您需要使用来自DeltaTable 对象(doc)的函数forName

    DeltaTable.forName(destMasterTable)
      .as("t")
      ...
    

    【讨论】:

    • 非常感谢。这就是我真正在寻找的东西。
    • 虽然在 databricks 文档中没有看到这些选项。
    猜你喜欢
    • 1970-01-01
    • 2021-07-26
    • 2022-12-04
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 2011-09-29
    • 1970-01-01
    相关资源
    最近更新 更多