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

Spark Dataframe groupBy并将结果排序到列表中

易品
2023-03-14

我有一个Spark数据框,我想按一个键对元素进行分组,并将结果作为一个排序列表

目前我正在使用:

df.groupBy("专栏A"). agg(collect_list("专栏B"))

如何使列表中的项目按升序排序?

共有2个答案

陶锋
2023-03-14

只是想在Daniel de Paula的回答中添加另一个关于sort_array解决方案的提示。

如果您想根据不同的列对元素进行排序,您可以形成两个字段的结构:

  • 按字段排序
  • 结果字段

由于结构是按字段排序的,所以您将获得所需的顺序,只需在结果列表的每个元素中去掉sort by列
在需要时,同样的方法也可以应用于多个按列排序。

下面是一个可以在本地spark shell模式下运行的示例(使用:粘贴模式):

import org.apache.spark.sql.Row
import spark.implicits._

case class Employee(name: String, department: String, salary: Double)

val employees = Seq(
  Employee("JSMITH", "A", 20.0),
  Employee("AJOHNSON", "A", 650.0),
  Employee("CBAKER", "A", 650.2),
  Employee("TGREEN", "A", 13.0),
  Employee("CHORTON", "B", 111.0),
  Employee("AIVANOV", "B", 233.0),
  Employee("VSMIRNOV", "B", 11.0)
)

val employeesDF = spark.createDataFrame(employees)

val getNames = udf { salaryNames: Seq[Row] =>
  salaryNames.map { case Row(_: Double, name: String) => name }
}

employeesDF
  .groupBy($"department")
  .agg(collect_list(struct($"salary", $"name")).as("salaryNames"))
  .withColumn("namesSortedBySalary", getNames(sort_array($"salaryNames", asc = false)))
  .show(truncate = false)

结果是:

+----------+--------------------------------------------------------------------+----------------------------------+
|department|salaryNames                                                         |namesSortedBySalary               |
+----------+--------------------------------------------------------------------+----------------------------------+
|B         |[[111.0, CHORTON], [233.0, AIVANOV], [11.0, VSMIRNOV]]              |[AIVANOV, CHORTON, VSMIRNOV]      |
|A         |[[20.0, JSMITH], [650.0, AJOHNSON], [650.2, CBAKER], [13.0, TGREEN]]|[CBAKER, AJOHNSON, JSMITH, TGREEN]|
+----------+--------------------------------------------------------------------+----------------------------------+
翟默
2023-03-14

您可以尝试functions软件包中提供的函数sort_array

scala prettyprint-override">import org.apache.spark.sql.functions._
df.groupBy("columnA").agg(sort_array(collect_list("columnB")))
 类似资料:
  • 问题内容: CREATE TABLE logistics ( id int primary key, campaign VARCHAR(255), event_type VARCHAR (255), date_offered VARCHAR (255), date_ordered DATE, date_delivered DATE, date_recorded DATE, date_complet

  • 问题内容: 已关闭 。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 7年前关闭。 改善这个问题 我想将排序的列表合并到一个列表中。这个解决方案如何?我相信它运行时间为O(n)。有任何明显的缺陷,效率低下或样式问题吗? 我真的不喜欢为“这是第一次迭代”设置标志并使用它来确保“最低”具有默认值的习惯用法。有没有更好的办法解决呢? 注

  • 我需要置换一个数组并将每个排列保存在arrayList中,我使用递归方法,但它只重复保存一个结果。

  • 我现在一直在努力使用Youtube的API v3,但我无法让它按照我想要的方式工作。我的目标是将选定播放列表中的最新视频加载到我的网站上。问题是,在我的回答中,我只有最老的视频。 要加载播放列表,我请求以下API URI:https://www.googleapis.com/youtube/v3/playlistItems 下面是一个请求的例子(点击执行即可):http://developers

  • 我正试图想出一个分而治之的算法来合并j个排序列表和n个元素,但我被卡住了;我不知道如何把这个问题分成更小的子问题。我希望合并算法更高效,如下所示: 合并前两个列表;然后将结果列表与第三个列表合并;然后将结果列表与第四个列表合并,以此类推,该列表取O(j*jn)。

  • 问题内容: 假设我有一堂课。 在其中,我有一个,其中一个值是。 我想获得的S: 我宁愿使用a 而不是对其进行迭代。 我该怎么做? 问题答案: 您可以使用。 假设您的输入是a ,则该类内的成员称为,并且为“ Breed”键存储了Breed: