gpt4 book ai didi

scala - 如何在spark中使用窗口函数过滤数据

转载 作者:行者123 更新时间:2023-12-01 11:24:30 25 4
gpt4 key购买 nike

我有以下数据:

rowid uid time code
1 1 5 a
2 1 6 b
3 1 7 c
4 2 8 a
5 2 9 c
6 2 9 c
7 2 10 c
8 2 11 a
9 2 12 c

现在我想以这样的方式过滤数据,我可以删除第 6 行和第 7 行,因为对于特定的 uid 我只想在代码中保留一行值为 'c'

所以预期的数据应该是:
rowid uid time code
1 1 5 a
2 1 6 b
3 1 7 c
4 2 8 a
5 2 9 c
8 2 11 a
9 2 12 c

我正在使用这样的窗口函数:
val window = Window.partitionBy("uid").orderBy("time")
val change = ((lag("code", 1).over(window) <=> "c")).cast("int")

这将帮助我们用代码“c”识别每一行。我可以扩展它以过滤掉行以获得预期的数据吗

最佳答案

如果您只想删除 code = "c"的行(每个 uid 的第一个除外),您可以尝试以下操作:

val window = Window.partitionBy("uid", "code").orderBy("time")
val result = df
.withColumn("rank", row_number().over(window))
.where(
(col("code") !== "c") ||
col("rank") === 1
)
.drop("rank")

根据新信息进行编辑:
val window = Window.partitionBy("uid").orderBy("time")
val result = df
.withColumn("lagValue", coalesce(lag(col("code"), 1).over(window), lit("")))
.where(
(col("code") !== "c") ||
(col("lagValue") !== "c")
)
.drop("lagValue")

关于scala - 如何在spark中使用窗口函数过滤数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38872592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com