scala - 如何在 Spark 窗口函数中使用 orderby() 降序排列?

标签 scala apache-spark apache-spark-sql

我需要一个窗口函数,该函数按某些键(=列名称)进行分区,按另一个列名称进行排序并返回排名前 x 的行。

这对于升序来说效果很好:

def getTopX(df: DataFrame, top_x: String, top_key: String, top_value:String): DataFrame ={
    val top_keys: List[String] = top_key.split(", ").map(_.trim).toList
    val w = Window.partitionBy(top_keys(1),top_keys.drop(1):_*)
       .orderBy(top_value)
    val rankCondition = "rn < "+top_x.toString
    val dfTop = df.withColumn("rn",row_number().over(w))
      .where(rankCondition).drop("rn")
  return dfTop
}

但是当我尝试将其更改为第 4 行中的 orderBy(desc(top_value))orderBy(top_value.desc) 时,出现语法错误。这里正确的语法是什么?

最佳答案

有两个版本的 orderBy,一种适用于字符串,另一种适用于 Column 对象 ( API )。您的代码使用第一个版本,该版本不允许更改排序顺序。您需要切换到列版本,然后调用 desc 方法,例如 myCol.desc

现在,我们进入 API 设计领域。传递Column参数的优点是你有更多的灵 active ,例如,你可以使用表达式等。如果你想维护一个接受字符串而不是的API Column,需要将字符串转换为列。有多种方法可以做到这一点,最简单的方法是使用 org.apache.spark.sql.functions.col(myColName)。

把它们放在一起,我们得到

.orderBy(org.apache.spark.sql.functions.col(top_value).desc)

关于scala - 如何在 Spark 窗口函数中使用 orderby() 降序排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38572888/

相关文章:

apache-spark - 创建包含 Spark 数据帧字段中数组中每个结构的第一个元素的数组

apache-spark - 使用 lit() 在 Spark 中创建新列

scala - UnFlatten Dataframe 到特定结构

java - Spark 平面 map 函数抛出 "OutOfMemory"

scala:如何以功能方式处理选项

Scala 函数式编程 : Should I use 'throw' or 'throw new' ?

java - 在 Scala 中执行多线程的推荐方法是什么

intellij-idea - IntelliJ IDE Spark 项目中的 Java.lang.ClassNotFoundException : oracle. jdbc.driver.OracleDriver

apache-spark - 无效字符串插值 : `$$' , `$' ident 或 `$' BlockExpr 预期 -> Spark SQL

scala - Spark 集成测试的 Hive 配置