我有一个Spark数据框,我想按一个键对元素进行分组,并将结果作为一个排序列表
目前我正在使用:
df.groupBy("专栏A"). agg(collect_list("专栏B"))
如何使列表中的项目按升序排序?
只是想在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]|
+----------+--------------------------------------------------------------------+----------------------------------+
您可以尝试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: