spark数据框中orderBy的列列表

Posted

技术标签:

【中文标题】spark数据框中orderBy的列列表【英文标题】:List of columns for orderBy in spark dataframe 【发布时间】:2020-04-10 19:45:11 【问题描述】:

我有一个包含列名的变量列表。我正在尝试使用它在数据帧上调用 orderBy。

val l = List("COL1", "COL2")
df.orderBy(l.mkString(","))

但是mkstring将列名合并为一个字符串,导致这个错误-

org.apache.spark.sql.AnalysisException: cannot resolve '`COL1,COL2`' given input columns: [COL1, COL2, COL3, COL4];

如何将此字符串列表转换为不同的字符串,以便查找“COL1”、“COL2”而不是“COL1、COL2”? 谢谢,

【问题讨论】:

【参考方案1】:

传递单个 String 参数是告诉 Spark 使用具有给定名称的一列对数据框进行排序。有一种方法可以接受多个列名,您可以这样使用它:

val l = List("COL1", "COL2")
df.orderBy(l.head, l.tail: _*)

如果您关心订单,请改用Column 版本的orderBy

val l = List($"COL1", $"COL2".desc)
df.orderBy(l: _*)

【讨论】:

谢谢。这就是我想要的。有没有办法在这里指定 desc ?【参考方案2】:

您可以为特定列调用 orderBy:

import org.apache.spark.sql.functions._
df.orderBy(asc("COL1")) // df.orderBy(asc(l.headOption.getOrElse("COL1")))
// OR
df.orderBy(desc("COL1"))

如果你想按多列排序,你可以这样写:

val l = List($"COL1", $"COL2".desc)
df.sort(l: _*)

【讨论】:

谢谢鲍勃,从头和尾开始,最终归结为使用你在最后的东西...... @NITS 不错!如果您满意,我们很高兴

以上是关于spark数据框中orderBy的列列表的主要内容,如果未能解决你的问题,请参考以下文章

Spark基于其他数据框中的列对数据框中的列进行重复数据删除

如何使用pyspark将具有多个可能值的Json数组列表转换为数据框中的列

将列表的列转换为数据框

使用 pyspark 将 Spark 数据框中的列转换为数组 [重复]

将前导零添加到 Spark 数据框中的列 [重复]

使用 json 模式更新 spark 数据框中的列