Jak sortować według kolumn w kolejności malejącej w Spark SQL?


145

Próbowałem, df.orderBy("col1").show(10)ale posortowano w kolejności rosnącej. df.sort("col1").show(10)sortuje również w porządku malejącym. Spojrzałem na stackoverflow i wszystkie odpowiedzi, które znalazłem, były nieaktualne lub odnosiły się do RDD . Chciałbym użyć natywnej ramki danych w Spark.


2
Oznacza "df.sort (" col1 "). Show (10) również sortuje w porządku rosnącym "
Josiah Yoder

To rozwiązanie działało idealnie dla mnie: stackoverflow.com/a/38575271/5957143
abc123

Odpowiedzi:


223

Możesz również posortować kolumnę, importując funkcje spark sql

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

Lub

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

importowanie sqlContext.implicits._

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

Lub

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

również wtedy, gdy jesteś zamawiania rosnąco po wszystkich kolumn, ascsłowo kluczowe nie jest konieczne: ..orderBy("col1", "col2").
Dan

97

Jest w org.apache.spark.sql.DataFramena sortmetodzie:

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

Zwróć uwagę $i .descwewnątrz sortkolumny, według której chcesz posortować wyniki.


5
import org.apache.spark.sql.functions._a import sqlContext.implicits._także wiele fajnych funkcji.
David Griffin

5
@Vedom: Pokazuje błąd składni: df.sort($"Time1", $"Time2".desc) SyntaxError: invalid syntaxprzy symbolu $
kaks,

@kaks, musisz zaimportować funkcje / implicity, jak opisano powyżej, aby uniknąć tego błędu
Rimer

49

Tylko PySpark

Natknąłem się na ten post, gdy chciałem zrobić to samo w PySpark. Najłatwiej jest po prostu dodać parametr ascending = False:

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

Źródła: http://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html#pyspark.sql.DataFrame.orderBy


8
Pytanie jest oznaczone tagiem scala, ale ta odpowiedź dotyczy tylko Pythona, ponieważ ta składnia, jak również sygnatura funkcji, dotyczą tylko języka Python.
Viacheslav Rodionov

3
Dzięki! Szukałem wersji PySpark.
arrkaye

14
import org.apache.spark.sql.functions.desc

df.orderBy(desc("columnname1"),desc("columnname2"),asc("columnname3"))

1
To jest duplikat odpowiedzi z odpowiedzi udzielonej 3 lata wcześniej przez @AmitDubey. powinien zostać usunięty na korzyść tego.
javadba


2

W przypadku Javy:

Jeśli użyjemy DataFrames, podczas stosowania złączeń (tutaj złączenie wewnętrzne), możemy posortować (w ASC) po wybraniu różnych elementów w każdym DF jako:

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

gdzie e_idjest kolumna, w której zastosowano łączenie, gdy jest sortowana według wynagrodzenia w ASC.

Możemy również użyć Spark SQL jako:

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

gdzie

  • spark -> SparkSession
  • wynagrodzenie -> GlobalTemp View.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.