【问题标题】:An efficient way to group, sort, and pivot rows?对行进行分组、排序和透视的有效方法?
【发布时间】:2021-07-10 22:35:38
【问题描述】:

我最近开始学习 PySpark 进行大数据分析。我有以下问题,并试图找到一种更好的方法来实现这一点。下面我将引导您解决问题。

鉴于下面的 pyspark 数据框:

Col1 Col2 Col3 DateTime Value
A C yyy 01.04.2019 100
B D yyy 05.04.2019 200
B D xxx 09.04.2019 50
A C yyy 08.04.2019 600
A C xxx 02.04.2019 580

我想按列分组 - Col1、Col2、Col3 并按每个组中的 DateTime 降序排序

Col1 Col2 Col3 DateTime Value
A C xxx 02.04.2019 580
A C yyy 08.04.2019 600
A C yyy 01.04.2019 100
B D xxx 09.04.2019 50
B D yyy 05.04.2019 200

然后,从这些排序组中的每一个中取出最上面的一行(即 DateTime 中的最后一行)

Col1 Col2 Col3 DateTime Value
A C xxx 02.04.2019 580
A C yyy 08.04.2019 600
B D xxx 09.04.2019 50
B D yyy 05.04.2019 200

最后,旋转 Col3 值并使用“值”

Col1 Col2 xxx yyy
A C 580 600
B D 50 200

我将如何以更少的步骤以有效的方式实现这一目标?在此先感谢:)

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql


    【解决方案1】:

    试试这个:

    data_df.withColumn("row_no", row_number().over(Window.partitionBy("Col1", "Col2", "Col3").orderBy("DateTime")))
      .filter(col("row_no") === 1)
      .select("Col1", "Col2", "Col3", "Value")
      .groupBy("Col1", "Col2")
      .pivot("Col3")
      .agg(collect_set("Value"))
      .show
    

    我没有将 DateTime 作为日期进行排序,所以你可以自己做,但会得到正确的结果

    【讨论】:

      【解决方案2】:

      让我们试试这个:

      第一个问题

      df.orderBy(df.Col1.asc(),df.Col2.asc(),df.Col3.asc()).show(truncate=False)
      

      df.createOrReplaceTempView("DATA")
      spark.sql("select Col1, Col2, Col3, DateTime, Value from DATA ORDER BY Col1 asc").show(truncate=False)
      

      第二个问题-因为您订购了它们,所以删除重复项

      df.dropDuplicates(["Col1","Col2","Col3"]).show()
      

      现在让我们转向

      import pyspark.sql.functions as psf
      df.groupBy(["Col1","Col2"]).pivot("Col3").agg(psf.max("Value")).show()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-05
        • 1970-01-01
        • 1970-01-01
        • 2021-06-01
        • 1970-01-01
        • 2022-01-18
        相关资源
        最近更新 更多