繁体   English   中英

如何在 Spark 窗口函数中以降序使用 orderby()?

[英]How to use orderby() with descending order in Spark window functions?

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

这适用于升序:

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参数的好处是你有更多的灵活性,例如,你可以使用表达式等。如果你想维护一个接受字符串而不是Column的 API,你需要将字符串转换为列。 有很多方法可以做到这一点,最简单的方法是使用org.apache.spark.sql.functions.col(myColName)

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

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

例如,如果我们需要在 Window 函数中按降序排列名为Date的列,请在列名前使用$符号,这将使我们能够使用ascdesc语法。

Window.orderBy($"Date".desc)

在双引号中指定列名后,给出.desc将按降序排序。

专栏

col = new Column("ts")
col = col.desc()
WindowSpec w = Window.partitionBy("col1", "col2").orderBy(col)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM