有选择地与三角洲湖覆盖数据
砖利用三角洲湖功能为选择性覆盖支持两个不同的选项:
的
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”,假)
集火花。砖。δ。replaceWhere。constraintCheck。启用=假
在砖运行时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
作为真正的
当使用动态分区覆盖。