当前位置: 首页 > 知识库问答 >
问题:

分组、排序和透视行的有效方法?

韦嘉颖
2023-03-14

我最近开始学习PySpark的大数据分析。我有以下问题,并试图找到一个更好的方法来实现这一点。我会带你解决下面的问题。

给定下面的pyspark数据框:

我想按列进行分组——Col1、Col2、Col3,并在每个组中按日期时间降序排序

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

最后,透视Col3值并使用“值”

我该如何以一种有效的方式,以较小的步骤实现这一目标?提前感谢:)

共有2个答案

端木淇
2023-03-14

试试这个:

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

厍建义
2023-03-14

让我们试试这个:

第一个问题

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()
 类似资料:
  • 我已经用id、app和客户输入了下面的dataframe 输入数据规则 预期产出 使用pivot和groggrege-make app值作为列名,并将聚合的客户名作为数据表中的列表 val newDF=df.groupby(“id”).pivot(“app”).agg(expr(“coalesce(first(customer),0)”)).drop(“app”).show() 问题:在我的查询中

  • 问题内容: 第一次尝试熊猫,我试图先按照索引对数据透视表进行排序,然后再对一系列值进行排序。 到目前为止,我已经尝试过: 按索引然后按值对数据透视表进行排序的正确方法是什么? 问题答案: 这是一个可以做您想要的解决方案: 结果将如下所示: 将其作为API方法内置到熊猫中会很好。虽然不确定应该是什么样。

  • 问题内容: 假设我们在集合中有一些项目,并且我们想使用某些比较器对它们进行排序,并期望结果在列表中: 一种方法是对列表中的项目进行排序,例如: Anothe方法正在使用排序流: 我想知道哪种方法更有效?排序流是否有任何优势(例如在多核上进行Faste排序)? 在运行时复杂性方面/最快方面是高效的。 我不相信自己要实现一个完美的基准,学习并不能真正启发我。 问题答案: 可以肯定地说,两种形式的排序都

  • 问题内容: 令我惊讶的是,以前没有提出过这个具体问题,但我的确没有在SO或文档中找到它。 假设我有一个包含整数的随机numpy数组,例如: 如果对它进行排序,则默认情况下我将获得升序: 但我希望解决方案按 降序 排序。 现在,我知道我可以永远做: 但这最后的陈述 有效 吗?它不是按升序创建副本,然后反转此副本以反转顺序获得结果吗?如果确实如此,是否有有效的选择?看起来好像不接受参数来更改排序操作中

  • 我有一个包含以下内容的xml。我想根据相关时间的值对作业进行排序。 对于每个作业,都有一个相关的时间,有两个值Num1和NUM2。 我想按这些值排序,所以如果: job1有时间1,值Num1=10,NUM2=12,而 job2有时间2,值Num1=10,NUM2=11,则输出应该是:job2,job1. 如果job3有时间3,值Num1=11,NUM2=09 输出应该是:job2,job1。 我能