PySpark:Groupby 案例

PySpark: Case When Groupby

考虑这个 MWE:

df = spark.createDataFrame([('A', 5, 0),('A',6, 0),('B',3, 0)], ['id', 'value', 'currentVersion'])
+---+-----+--------------+
| id|value|currentVersion|
+---+-----+--------------+
|  A|    5|             0|
|  A|    6|             0|
|  B|    3|             0|
+---+-----+--------------+

有了这个预期的输出

#+---+-----+----------+
#| id|value|currentVersion|
#+---+-----+----------+
#|  A|    5|       0|
#|  A|    6|       1|
#|  B|    0|       0 |
#+---+-----+----------+

如何在依赖 groupby 的同时获得预期的输出?

这对我的其他目的很有效,但失败了,因为我需要合并 groupby:

valueWhenTrue = 1
valueWhenFalse = 0

df = df.withColumn(
    "currentVersion",
    when(
        F.col("TimeStamp") == df.agg({"TimeStamp": "max"}).collect()[0][0],
        valueWhenTrue
    ).otherwise(valueWhenFalse)
)

找到适合我的答案:

# groupby -- find max time
window_var = Window().partitionBy('TicketNumber')
df = df.withColumn('maxModified', F.max('Modified').over(window_var))


# case when
valueWhenTrue = 1
valueWhenFalse = 0

df = df.withColumn(
    "currentVersion",
    when(
        F.col("maxModified") == F.col('Modified'),
        valueWhenTrue
    ).otherwise(valueWhenFalse)
)