一种对行进行分组、排序和透视的有效方法?

时间:2021-04-15 21:11:45

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

我最近开始学习用于大数据分析的 PySpark。我有以下问题,正在努力寻找更好的方法来实现这一目标。我将引导您解决下面的问题。

鉴于下面的 pyspark 数据框:

<头>
Col1 Col2 Col3 日期时间 价值
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 并按每个组中的日期时间降序排序

<头>
Col1 Col2 Col3 日期时间 价值
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 日期时间 价值
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

我将如何以较少的步骤以有效的方式实现这一目标?提前致谢:)

2 个答案:

答案 0 :(得分:1)

让我们试试这个:

第一个问题

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()

答案 1 :(得分:0)

试试这个:

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 作为排序的日期,所以你可以自己做,但会得到正确的结果