我需要一个窗口函数,该函数按某些键(=列名称)进行分区,按另一个列名称进行排序并返回排名前 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
}
但是当我尝试将其更改为orderBy(desc(top_value))
or orderBy(top_value.desc)
在第 4 行中,我收到语法错误。这里正确的语法是什么?
有两个版本orderBy
,一个适用于字符串,一个适用于Column
对象(API https://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.expressions.WindowSpec)。您的代码使用第一个版本,该版本不允许更改排序顺序。您需要切换到列版本,然后调用desc
方法,例如myCol.desc
.
现在,我们进入 API 设计领域。通过的优势Column
参数的优点是你有更多的灵活性,例如,你可以使用表达式等。如果你想维护一个接受字符串而不是字符串的 APIColumn
,您需要将字符串转换为列。有多种方法可以做到这一点,最简单的是使用org.apache.spark.sql.functions.col(myColName)
.
把它们放在一起,我们得到
.orderBy(org.apache.spark.sql.functions.col(top_value).desc)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)