有选择地与三角洲湖覆盖数据

砖利用三角洲湖功能为选择性覆盖支持两个不同的选项:

  • replaceWhere选择自动替换匹配给定谓词的所有记录。

  • 可以替换目录的数据基于表分区使用动态分区覆盖。

对于大多数操作,砖推荐使用replaceWhere指定的数据覆盖。

重要的

如果数据被意外地覆盖,可以使用恢复撤消更改。

任意选择覆盖与replaceWhere

你可以选择性地覆盖只匹配一个任意的数据表达。这个特性与DataFrames可用砖运行时9.1 LTS及以上和支持SQL砖运行时的12.0(不支持)及以上。

下面的命令自动替换事件1月目标表,分区的start_date中的数据replace_data:

(replace_data模式(“覆盖”)选项(“replaceWhere”,“start_date > = ' 2017-01-01 '和end_date < = 2017-01-31”)保存(“/ tmp /δ/事件”))
replace_data模式(“覆盖”)选项(“replaceWhere”,“start_date > = ' 2017-01-01 '和end_date < = 2017-01-31”)保存(“/ tmp /δ/事件”)
插入事件取代在哪里start_data> =“2017-01-01”end_date< =“2017-01-31”选择*replace_data

这个示例代码写出数据replace_data,验证与谓词匹配,并执行一个原子替换。如果你想写出数据不匹配谓词,来取代匹配目标表中的行,您可以禁用约束检查通过设置spark.databricks.delta.replaceWhere.constraintCheck.enabled假:

火花相依(“spark.databricks.delta.replaceWhere.constraintCheck.enabled”,)
火花相依(“spark.databricks.delta.replaceWhere.constraintCheck.enabled”,)
火花δreplaceWhereconstraintCheck启用=

在砖运行时9.0及以下,replaceWhere覆盖数据匹配谓词在分区列。下面的命令自动替换1月目标表,分区的日期中的数据df:

(df模式(“覆盖”)选项(“replaceWhere”,“生日> = ' 2017-01-01 '和生日< = 2017-01-31”)保存(“/ tmp /δ/ people10m”))
df模式(“覆盖”)选项(“replaceWhere”,“生日> = ' 2017-01-01 '和生日< = 2017-01-31”)保存(“/ tmp /δ/ people10m”)

在砖运行时9.1及以上的,如果你想回到旧的行为,您可以禁用spark.databricks.delta.replaceWhere.dataColumns.enabled国旗:

火花相依(“spark.databricks.delta.replaceWhere.dataColumns.enabled”,)
火花相依(“spark.databricks.delta.replaceWhere.dataColumns.enabled”,)
火花δreplaceWhere启用=

动态分区覆盖

预览

这个特性是在公共预览

砖运行时11.1及以上支持动态为分区表分区覆盖模式。对于多个分区的表,砖12.0运行时,下面只支持动态分区覆盖如果所有分区列是相同的数据类型。

在动态分区覆盖模式下,业务覆盖所有现有数据在每一个逻辑分区的写提交新的数据。任何现有的逻辑分区的写不包含数据保持不变。这种模式只适用于当数据被写在覆盖模式:插入覆盖在SQL或DataFrame写字df.write.mode(“覆盖”)

配置动态分区覆盖模式通过设置引发会话配置spark.sql.sources.partitionOverwriteMode动态。你也可以启用这个通过设置DataFrameWriter选项partitionOverwriteMode动态。如果存在,query-specific选项覆盖会话配置中定义的模式。的默认值partitionOverwriteMode静态

重要的

验证数据与动态分区覆盖触动只有预期的分区。一行在错误的分区可以导致无意中覆盖整个分区。

下面的例子演示了使用动态分区覆盖:

火花sql来源partitionOverwriteMode=动态;插入覆盖默认的people10m选择*更多人;
(df模式(“覆盖”)选项(“partitionOverwriteMode”,“动态”)saveAsTable(“default.people10m”))
df模式(“覆盖”)选项(“partitionOverwriteMode”,“动态”)saveAsTable(“default.people10m”)

请注意

  • 动态分区覆盖冲突与选择replaceWhere分区表。

    • 如果启用了动态分区覆盖在火花会话配置中,和replaceWhere作为一个提供DataFrameWriter选项,然后根据三角洲湖覆盖数据replaceWhere表达式(query-specific选项覆盖会话配置)。

    • 如果你得到一个错误DataFrameWriter动态分区覆盖和选项replaceWhere启用。

  • 你不能指定overwriteSchema作为真正的当使用动态分区覆盖。