如何将共享 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 中将多行合并为一行,用逗号分隔

SQL Query 根据 ID 将多行合并为一行,同时将其他值保留在同一行中?

连接多行 Pyspark

SQL使用唯一键将多行合并为一行

如何将多行合并为一行?

SQL多行合并为一行,SQL语句如何写