Comment trier par colonne dans l'ordre décroissant dans Spark SQL?

137

J'ai essayé df.orderBy("col1").show(10)mais il a trié par ordre croissant. df.sort("col1").show(10)trie également par ordre décroissant. J'ai regardé stackoverflow et les réponses que j'ai trouvées étaient toutes obsolètes ou renvoyées à des RDD . J'aimerais utiliser le dataframe natif dans spark.

Vedom
la source
2
Il signifie "df.sort (" col1 "). Show (10) trie également dans l' ordre croissant "
Josiah Yoder
Cette solution a parfaitement fonctionné pour moi: stackoverflow.com/a/38575271/5957143
abc123

Réponses:

214

Vous pouvez également trier la colonne en important les fonctions Spark SQL

import org.apache.spark.sql.functions._
df.orderBy(asc("col1"))

Ou

import org.apache.spark.sql.functions._
df.sort(desc("col1"))

importation de sqlContext.implicits._

import sqlContext.implicits._
df.orderBy($"col1".desc)

Ou

import sqlContext.implicits._
df.sort($"col1".desc)
Gabber
la source
aussi quand vous commandez par ordre croissant toutes les colonnes, le ascmot - clé n'est pas nécessaire: ..orderBy("col1", "col2").
Dan
91

C'est org.apache.spark.sql.DataFramepour la sortméthode:

df.sort($"col1", $"col2".desc)

Remarque $et à l' .descintérieur sortde la colonne pour trier les résultats.

Vedom
la source
5
import org.apache.spark.sql.functions._et import sqlContext.implicits._vous offre également de nombreuses fonctionnalités intéressantes.
David Griffin
4
@Vedom: affiche une erreur de syntaxe: df.sort($"Time1", $"Time2".desc) SyntaxError: invalid syntaxau symbole $
kaks
@kaks, besoin d'importer des fonctions / implicites comme décrit ci-dessus pour éviter cette erreur
Rimer
41

PySpark uniquement

Je suis tombé sur ce post en cherchant à faire de même dans PySpark. Le moyen le plus simple est d'ajouter simplement le paramètre ascending = False:

df.orderBy("col1", ascending=False).show(10)

Référence: http://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html#pyspark.sql.DataFrame.orderBy

Nic Scozzaro
la source
8
La question est marquée d'une balise scala, mais cette réponse est pour python uniquement car cette syntaxe ainsi qu'une signature de fonction sont uniquement python.
Viacheslav Rodionov
1
Merci! Je cherchais la version PySpark.
arrkaye
12
import org.apache.spark.sql.functions.desc

df.orderBy(desc("columnname1"),desc("columnname2"),asc("columnname3"))
Nitya Yekkirala
la source
1
C'est une réponse en double de celle de 3 ans plus tôt par @AmitDubey. devrait être retiré en faveur de celui-là.
javadba
7
df.sort($"ColumnName".desc).show()
Nilesh Shinde
la source
2

Dans le cas de Java:

Si nous utilisons DataFrames, lors de l'application de jointures (ici jointure interne), nous pouvons trier (en ASC) après avoir sélectionné des éléments distincts dans chaque DF comme:

Dataset<Row> d1 = e_data.distinct().join(s_data.distinct(), "e_id").orderBy("salary");

e_idest la colonne sur laquelle la jointure est appliquée lors du tri par salaire dans ASC.

En outre, nous pouvons utiliser Spark SQL comme:

SQLContext sqlCtx = spark.sqlContext();
sqlCtx.sql("select * from global_temp.salary order by salary desc").show();

  • étincelle -> SparkSession
  • salaire -> GlobalTemp View.
RPaul
la source