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)
)
考虑这个 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)
)