启用跨作业的幂等写入

有时,由于各种原因(例如,作业遇到失败),将数据写入Delta表的作业会重新启动。失败的作业可能在终止前将数据写入Delta表,也可能没有。在将数据写入Delta表的情况下,重新启动的作业将相同的数据写入Delta表,这将导致重复的数据。

为了解决这个问题,Delta表支持以下功能DataFrameWriter使写函数幂等的选项:

  • txnAppId:可以传递给每个对象的唯一字符串DataFrame写。例如,这可以是作业的名称。

  • txnVersion:作为事务版本的单调递增的数字。对于写入Delta表的数据,这个数字必须是唯一的。例如,这可以是第一次尝试查询时的epoch秒。同一作业的任何后续重启都需要具有相同的for值txnVersion

类中所摄取的每个新数据,上面的选项组合必须是唯一的txnVersion需要高于最后一个被摄取到Delta表的数据。例如:

  • 最后一次成功写入的数据包含选项值为dailyETL: 23423txnAppId: txnVersion).

  • 下一次写入的数据应该有txnAppIddailyETL而且txnVersion至少是这样23424(比上次写入的数据多一个txnVersion).

  • 写入数据的任何尝试txnAppIddailyETL而且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).保存(…)