如何将共享 id 的多行合并为一行(PYSPARK)
Posted
技术标签:
【中文标题】如何将共享 id 的多行合并为一行(PYSPARK)【英文标题】:How to merge multiple rows sharing id into one single row (PYSPARK) 【发布时间】:2020-03-20 14:13:33 【问题描述】:我在 PySpark 中有这个数据框。我想获得 col3 的唯一值。 在 SQL 中,我将按 col1 分组并将 max(col3) 作为 col3
+----+----+----+ |col1|col2|col3| +----+----+----+ | 0| 1| 0| | 0| 1| 0| | 0| 1| 0| | 1| 1| 0| | 1| 1| 1| | 1| 1| 1| | 2| 1| 0| | 2| 1| 1| | 2| 1| 0| +----+----+----+
这是预期的输出:
+----+----+----+ |col1|col2|col3| +----+----+----+ | 0| 1| 0| | 1| 1| 1| | 2| 1| 1| +----+----+----+
【问题讨论】:
【参考方案1】:您可以在 pyspark .groupBy 中对 col1,col2 执行相同的逻辑,然后 agg 获取最大 col3 值。
其他方法是使用窗口row_number
函数和 partitionby
col1,col2 和 orderby desc
col3 并仅选择 rownumber == 1
Example:
df.show()
#+----+----+----+
#|col1|col2|col3|
#+----+----+----+
#| 0| 1| 0|
#| 0| 1| 0|
#| 0| 1| 0|
#| 1| 1| 0|
#| 1| 1| 1|
#| 1| 1| 1|
#| 2| 1| 0|
#| 2| 1| 1|
#| 2| 1| 0|
#+----+----+----+
df.groupBy("col1","col2").agg(max("col3").alias("col3")).orderBy("col3").show()
#+----+----+----+
#|col1|col2|col3|
#+----+----+----+
#| 0| 1| 0|
#| 1| 1| 1|
#| 2| 1| 1|
#+----+----+----+
Using row_number():
from pyspark.sql.window import Window
w = Window.partitionBy("col1","col2").orderBy(desc("col3"))
df.withColumn("rn", row_number().over(w)).filter(col("rn") == 1).drop("rn").orderBy("col3").show()
#+----+----+----+
#|col1|col2|col3|
#+----+----+----+
#| 0| 1| 0|
#| 1| 1| 1|
#| 2| 1| 1|
#+----+----+----+
【讨论】:
以上是关于如何将共享 id 的多行合并为一行(PYSPARK)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Microsoft SQL Server Management Studio 中将多行合并为一行,用逗号分隔