【发布时间】:2020-04-22 11:56:18
【问题描述】:
尝试在 Spark 2.4.4 中实现 SCD Type 2 逻辑。我有两个数据框;一个包含“现有数据”,另一个包含“新传入数据”。
输入和预期输出如下所示。需要发生的是:
-
所有传入的行都应该附加到现有数据中。
-
只有以下 3 行之前是“活动的”才应该变为非活动的,并填充如下适当的“结束日期”:
pk=1, amount = 20 => Row 应该变成'inactive' & 'endDate' 是下一行(Lead)的'startDate'
pk=2, amount = 100 => Row 应该变成'inactive' & 'endDate' 是下一行(Lead)的'startDate'
pk=3, amount = 750 => Row 应该变成'inactive' & 'endDate' 是下一行(Lead)的'startDate'
如何在 Spark 中执行此操作?
现有数据:
+---+------+-------------------+-------------------+------+
| pk|amount| startDate| endDate|active|
+---+------+-------------------+-------------------+------+
| 1| 10|2019-01-01 12:00:00|2019-01-20 05:00:00| 0|
| 1| 20|2019-01-20 05:00:00| null| 1|
| 2| 100|2019-01-01 00:00:00| null| 1|
| 3| 75|2019-01-01 06:00:00|2019-01-26 08:00:00| 0|
| 3| 750|2019-01-26 08:00:00| null| 1|
| 10| 40|2019-01-01 00:00:00| null| 1|
+---+------+-------------------+-------------------+------+
新传入数据:
+---+------+-------------------+-------------------+------+
| pk|amount| startDate| endDate|active|
+---+------+-------------------+-------------------+------+
| 1| 50|2019-02-01 07:00:00|2019-02-02 08:00:00| 0|
| 1| 75|2019-02-02 08:00:00| null| 1|
| 2| 200|2019-02-01 05:00:00|2019-02-01 13:00:00| 0|
| 2| 60|2019-02-01 13:00:00|2019-02-01 19:00:00| 0|
| 2| 500|2019-02-01 19:00:00| null| 1|
| 3| 175|2019-02-01 00:00:00| null| 1|
| 4| 50|2019-02-02 12:00:00|2019-02-02 14:00:00| 0|
| 4| 300|2019-02-02 14:00:00| null| 1|
| 5| 500|2019-02-02 00:00:00| null| 1|
+---+------+-------------------+-------------------+------+
预期输出:
+---+------+-------------------+-------------------+------+
| pk|amount| startDate| endDate|active|
+---+------+-------------------+-------------------+------+
| 1| 10|2019-01-01 12:00:00|2019-01-20 05:00:00| 0|
| 1| 20|2019-01-20 05:00:00|2019-02-01 07:00:00| 0|
| 1| 50|2019-02-01 07:00:00|2019-02-02 08:00:00| 0|
| 1| 75|2019-02-02 08:00:00| null| 1|
| 2| 100|2019-01-01 00:00:00|2019-02-01 05:00:00| 0|
| 2| 200|2019-02-01 05:00:00|2019-02-01 13:00:00| 0|
| 2| 60|2019-02-01 13:00:00|2019-02-01 19:00:00| 0|
| 2| 500|2019-02-01 19:00:00| null| 1|
| 3| 75|2019-01-01 06:00:00|2019-01-26 08:00:00| 0|
| 3| 750|2019-01-26 08:00:00|2019-02-01 00:00:00| 1|
| 3| 175|2019-02-01 00:00:00| null| 1|
| 4| 50|2019-02-02 12:00:00|2019-02-02 14:00:00| 0|
| 4| 300|2019-02-02 14:00:00| null| 1|
| 5| 500|2019-02-02 00:00:00| null| 1|
| 10| 40|2019-01-01 00:00:00| null| 1|
+---+------+-------------------+-------------------+------+
【问题讨论】:
-
想知道为什么我在这个问题上投了反对票 (-1)。有人可以解释一下吗?
-
请参阅 stackoverflow.com/questions/54058951/… 我回答问题的地方。使用 KUDU 效果更好,但我们通过重新声明来做到这一点,并且可以以各种方式压缩小文件问题。
标签: java scala apache-spark apache-spark-sql