2016-07-25 1 views
8

J'ai besoin d'une fonction de fenêtre qui partitionne par certaines clés (= noms de colonnes), les commandes par un autre nom de colonne et renvoie les lignes avec les rangs x supérieurs.Comment utiliser orderby() dans l'ordre décroissant des fonctions de la fenêtre Spark?

Cela fonctionne très bien pour l'ordre croissant:

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 
} 

Mais quand j'essaie de le changer à orderBy(desc(top_value)) ou orderBy(top_value.desc) en ligne 4, je reçois une erreur de syntaxe. Quelle est la syntaxe correcte ici?

+0

Quel est le message d'erreur que vous obtenez? –

Répondre

16

Il existe deux versions de orderBy, une qui fonctionne avec des chaînes et une qui fonctionne avec des objets Column (API). Votre code utilise la première version, ce qui ne permet pas de changer l'ordre de tri. Vous devez passer à la version de la colonne, puis appeler la méthode desc, par exemple, myCol.desc.

Maintenant, nous entrons dans le domaine de la conception d'API. L'avantage de passer les paramètres Column est que vous avez beaucoup plus de flexibilité, par exemple, vous pouvez utiliser des expressions, etc. Si vous voulez maintenir une API qui accepte une chaîne par opposition à Column, vous devez convertir la chaîne en colonne. Il existe un certain nombre de façons de le faire et le plus simple est d'utiliser org.apache.spark.sql.functions.col(myColName).

Mettre le tout ensemble, nous obtenons

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

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

+0

Les parenthèses sont inutiles dans Scala. – Sim

+0

ohh ... bien sûr que je n'ai pas vérifié que le code dans la question est scala, et a une balise scala :) Désolé à ce sujet – kecso