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

Scala 如何在Spark窗口函数中使用降序orderby()?,scala,apache-spark,apache-spark-sql,spark-dataframe,Scala,Apache Spark,Apache Spark Sql,Spark Dataframe,我需要一个窗口函数,该函数按一些键(=列名)进行分区,按另一个列名排序,并返回排名前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(to

我需要一个窗口函数,该函数按一些键(=列名)进行分区,按另一个列名排序,并返回排名前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
}
def getTopX(df:DataFrame,top\u x:String,top\u key:String,top\u value:String):数据帧={
val top_key:List[String]=top_key.split(“,”).map(u.trim).toList
val w=窗口.partitionBy(顶键(1),顶键.drop(1):\uu*)
.orderBy(最大值)
val rankCondition=“rn<”+top\u x.toString
val dfTop=df.带列(“rn”,行号(),在(w)上方)
.where(rankCondition).drop(“rn”)
返回dfTop
}

但是当我试图在第4行中将其更改为
orderBy(desc(top_value))
orderBy(top_value.desc)
时,我得到了一个语法错误。这里的正确语法是什么

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

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

把这一切放在一起,我们得到了

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

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

Window.orderBy($"Date".desc)
在用双引号指定列名后,给出将按降序排序的
.desc

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

数据集中的orderBy和sort相同吗?因为两者都适合我
org.apache.spark.sql.functions.{col}
bhData.sort(col(“count”).desc)
@vijayraj34这个问题是关于窗口函数的,在
WindowSpec
中没有
sortBy
。因此,我假定您询问的是数据集级别的排序。如果您阅读
数据集的Spark代码库
,您将看到
def orderBy(sortExprs:Column*):Dataset[T]=sort(sortExprs:*)
。换句话说,
sort
相当于数据集级别的
orderBy
。我在描述之后没有使用括号时出错,不知道为什么。一旦添加,它就可以按我所希望的那样工作。orderBy(f.col('col_name_1')、f.col('date')、f.col('col_name_2').desc())@Anne您不应该在Scala中使用括号,这是问题中标记的语言,但您必须在Python中使用括号,如果字符串周围有单引号,您似乎正在使用它。@Sim My bad,抱歉!我涉猎了PySpark,当然这与本文无关。