使用 Scala Spark 比较两个值

时间:2021-01-22 09:40:36

标签: scala dataframe apache-spark apache-spark-sql window-functions

我得到了下一个镶木地板文件:

+--------------+------------+-------+
|gf_cutoff     | country_id |gf_mlt |
+--------------+------------+-------+
|2020-12-14    |DZ          |5      |
|2020-08-06    |DZ          |4      |
|2020-07-03    |DZ          |4      |
|2020-12-14    |LT          |1      |
|2020-08-06    |LT          |1      |
|2020-07-03    |LT          |1      |

如您所见,按 country_id 参与按 gf_cutoff DESC 排序。我想做的是比较 gf_mlt 以检查值是否已更改。为此,我想将最近的 gf_cutoff 与第二个进行比较。

这种情况的一个例子是比较:

 2020-12-14 DZ 5
with
 2020-08-06 DZ 4

我想在一个新列中写入,如果最近日期的值与第二行不同,则放入一个新列,DZ 的最新值为 5 并放入另一列 True if值已更改,如果未更改则为 false。 做完这个比较后,删除旧行的行。

DZ 变了,LT 没变,因为一直都是 1。

所以输出应该是这样的:

+--------------+------------+-------+------------+-----------+
|gf_cutoff     | country_id |gf_mlt | Has_change | old_value |
+--------------+------------+-------+------------+-----------+
|2020-12-14    |DZ          |5      |    True    |     4     |
|2020-12-14    |LT          |1      |    False   |     1     |

如果您需要更多解释,请告诉我。

1 个答案:

答案 0 :(得分:1)

您可以在适当的窗口上使用 lag 来获取最近的值,然后在另一个适当的窗口上使用 row_number 过滤最近的行:

import org.apache.spark.sql.expressions.Window

val df2 = df.withColumn(
    "last_value",
    lag("gf_mlt", 1).over(Window.partitionBy("country_id").orderBy("gf_cutoff"))
).withColumn(
    "rn", 
    row_number().over(Window.partitionBy("country_id").orderBy(desc("gf_cutoff")))
).filter("rn = 1").withColumn(
    "changed",
    $"gf_mlt" === $"last_value"
).drop("rn")

df2.show
+----------+----------+------+----------+-------+
| gf_cutoff|country_id|gf_mlt|last_value|changed|
+----------+----------+------+----------+-------+
|2020-12-14|        DZ|     5|         4|  false|
|2020-12-14|        LT|     1|         1|   true|
+----------+----------+------+----------+-------+
相关问题