我最近开始学习用于大数据分析的 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 |
我将如何以较少的步骤以有效的方式实现这一目标?提前致谢:)
答案 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 作为排序的日期,所以你可以自己做,但会得到正确的结果