apache-spark - Spark 窗口函数中的条件

我有一个类似的数据框

+---+---+---+---+
|  q|  w|  e|  r|
+---+---+---+---+
|  a|  1| 20|  y|
|  a|  2| 22|  z|
|  b|  3| 10|  y|
|  b|  4| 12|  y|
+---+---+---+---+

我想用最小的 er = z 标记行。如果没有具有 r = z 的行,我想要具有最小 e 的行,即使 r = y 也是如此。 本质上,像

+---+---+---+---+---+
|  q|  w|  e|  r|  t|
+---+---+---+---+---+
|  a|  1| 20|  y|  0|
|  a|  2| 22|  z|  1|
|  b|  3| 10|  y|  1|
|  b|  4| 12|  y|  0|
+---+---+---+---+---+

我可以使用多个连接来做到这一点,但是那太昂贵了。 所以我一直在寻找基于窗口的解决方案。

最佳答案

您可以为具有 r = z 的行计算一次每组的最小值,然后为一个组中的所有行计算一次。然后可以将第一个非空值与 e 进行比较:

from pyspark.sql import functions as F
from pyspark.sql import Window

df = ...

w = Window.partitionBy("q")
#When ordering is not defined, an unbounded window frame is used by default.

df.withColumn("min_e_with_r_eq_z", F.expr("min(case when r='z' then e else null end)").over(w)) \
    .withColumn("min_e_overall", F.min("e").over(w)) \
    .withColumn("t", F.coalesce("min_e_with_r_eq_z","min_e_overall") == F.col("e")) \
    .orderBy("w") \
    .show()

输出:

+---+---+---+---+-----------------+-------------+-----+
|  q|  w|  e|  r|min_e_with_r_eq_z|min_e_overall|    t|
+---+---+---+---+-----------------+-------------+-----+
|  a|  1| 20|  y|               22|           20|false|
|  a|  2| 22|  z|               22|           20| true|
|  b|  3| 10|  y|             null|           10| true|
|  b|  4| 12|  y|             null|           10|false|
+---+---+---+---+-----------------+-------------+-----+

注意:我假设 q 是窗口的分组列。

https://stackoverflow.com/questions/67514479/

相关文章:

vue.js - 如何将第三方脚本代码添加到 Nuxt 中?

clojure - 如何在 clojure 中生成随机字母数字字符串?

android-studio - 如何降级 Kotlin 版本

python - 为什么我没有从使用编码数据库中得到 SQL 查询的结果?

python-3.x - 使用 pytest 禁用在控制台上打印日志输出

javascript - 有什么办法可以缩短这段代码吗?

python - 无法使用 pytesseract.image_to_string 从图像中读取文本

javascript - 如何仅在特定页面中删除页脚组件?

docker - Jenkins SSH 管道步骤 - 需要一个终端来读取密码

python - 对象没有属性