Как использовать orderby () с нисходящим порядком в функциях Spark window?
мне нужна функция окна, которая разбивает некоторые ключи (=имена столбцов), заказы по другому имени столбца и возвращает строки с верхними 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))
или orderBy(top_value.desc)
в строке 4, я получаю синтаксическую ошибку. Какой здесь правильный синтаксис?
1 ответов
существует две версии orderBy
, тот, который работает со строками и тот, который работает с Column
объекты (API). Ваш код использует первую версию, которая не позволяет изменить порядок сортировки. Вам нужно переключиться на версию столбца, а затем вызвать desc
метод, например, myCol.desc
.
теперь мы попадаем на территорию дизайна API. Преимущество прохождения Column
параметры - это то, что у вас намного больше гибкости, например, вы можете использовать выражения и т. д. Если вы хотите поддерживать API, который принимает строку, а не Column
, вам нужно преобразовать строку в столбец. Существует несколько способов сделать это, и самый простой-использовать org.apache.spark.sql.functions.col(myColName)
.
собирая все это вместе, мы получаем
.orderBy(org.apache.spark.sql.functions.col(top_value).desc)