【问题标题】:How to merge multiple rows sharing id into one single row (PYSPARK)如何将共享 id 的多行合并为一行(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| +----+----+----+

【问题讨论】:

    标签: pyspark


    【解决方案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|
    #+----+----+----+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多