启用跨作业的幂等写入
有时,由于各种原因(例如,作业遇到失败),将数据写入Delta表的作业会重新启动。失败的作业可能在终止前将数据写入Delta表,也可能没有。在将数据写入Delta表的情况下,重新启动的作业将相同的数据写入Delta表,这将导致重复的数据。
为了解决这个问题,Delta表支持以下功能DataFrameWriter
使写函数幂等的选项:
txnAppId
:可以传递给每个对象的唯一字符串DataFrame
写。例如,这可以是作业的名称。txnVersion
:作为事务版本的单调递增的数字。对于写入Delta表的数据,这个数字必须是唯一的。例如,这可以是第一次尝试查询时的epoch秒。同一作业的任何后续重启都需要具有相同的for值txnVersion
.
类中所摄取的每个新数据,上面的选项组合必须是唯一的txnVersion
需要高于最后一个被摄取到Delta表的数据。例如:
最后一次成功写入的数据包含选项值为
dailyETL: 23423
(txnAppId: txnVersion
).下一次写入的数据应该有
txnAppId=dailyETL
而且txnVersion
至少是这样23424
(比上次写入的数据多一个txnVersion
).写入数据的任何尝试
txnAppId=dailyETL
而且txnVersion
作为23422
或者less被忽略,因为txnVersion
比上次记录的少吗txnVersion
在表格中。尝试写入数据
txnAppId: txnVersion
作为anotherETL: 23424
成功写入数据到表,因为它包含不同的txnAppId
与上次摄取数据中的相同选项值进行比较。
警告
这个解决方案假设在多次重试作业中写入Delta表的数据是相同的。如果对Delta表的写尝试成功,但由于某些下游故障,有第二次写尝试,具有相同的txn选项,但数据不同,那么第二次写尝试将被忽略。这可能会导致意想不到的结果。
请看下面的示例代码:
app_id=...#作为应用程序ID的唯一字符串。版本=...一个单调递增的数字,作为事务版本。dataFrame.写.选项(“txnVersion”,版本).选项(“txnAppId”,app_id).保存(...)
瓦尔appId=...//作为应用程序ID的唯一字符串。版本=...//一个单调递增的数字,作为事务版本。dataFrame.写.选项(“txnVersion”,版本).选项(“txnAppId”,appId).保存(…)