如何在 Spark window 函数中以降序使用 orderby()?
How to use orderby() with descending order in Spark window functions?
我需要一个 window 函数,它按一些键(=列名)进行分区,按另一个列名排序,returns 排在前 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
参数的优点是你有更多的灵活性,例如,你可以使用表达式等。如果你想维护一个接受字符串而不是 [=] 的 API 12=],需要将字符串转为列。有多种方法可以做到这一点,最简单的方法是使用 org.apache.spark.sql.functions.col(myColName)
.
把它们放在一起,我们得到
.orderBy(org.apache.spark.sql.functions.col(top_value).desc)
例如,如果我们需要在 Window 函数中按降序排列名为 Date
的列,请在列名前使用 $
符号,这将使我们使用 asc
或 desc
语法。
Window.orderBy($"Date".desc)
在双引号中指定列名后,给出 .desc
将按降序排序。
列
col = new Column("ts")
col = col.desc()
WindowSpec w = Window.partitionBy("col1", "col2").orderBy(col)
我需要一个 window 函数,它按一些键(=列名)进行分区,按另一个列名排序,returns 排在前 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
参数的优点是你有更多的灵活性,例如,你可以使用表达式等。如果你想维护一个接受字符串而不是 [=] 的 API 12=],需要将字符串转为列。有多种方法可以做到这一点,最简单的方法是使用 org.apache.spark.sql.functions.col(myColName)
.
把它们放在一起,我们得到
.orderBy(org.apache.spark.sql.functions.col(top_value).desc)
例如,如果我们需要在 Window 函数中按降序排列名为 Date
的列,请在列名前使用 $
符号,这将使我们使用 asc
或 desc
语法。
Window.orderBy($"Date".desc)
在双引号中指定列名后,给出 .desc
将按降序排序。
列
col = new Column("ts")
col = col.desc()
WindowSpec w = Window.partitionBy("col1", "col2").orderBy(col)