如何在Spark SQL中按列降序排序?


137

我试过了,df.orderBy("col1").show(10)但是按升序排序。df.sort("col1").show(10)也按降序排序。我查看了stackoverflow,发现的答案都已过时或提到了RDD。我想在Spark中使用本机数据框。


2
他的意思是“ df.sort(“ col1”)。show(10)也按升序排序”
Josiah Yoder

这个解决方案对我来说是完美的:stackoverflow.com/a/38575271/5957143
abc123

Answers:


214

您还可以通过导入spark sql函数对列进行排序

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

要么

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

导入sqlContext.implicits._

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

要么

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

同样,如果您要按所有列升序排列,asc则不需要使用关键字:..orderBy("col1", "col2")

91

它在org.apache.spark.sql.DataFramefor sort方法中:

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

注意$.desc在内部sort对列进行排序。


5
import org.apache.spark.sql.functions._并为import sqlContext.implicits._您提供许多不错的功能。
大卫·格里芬

4
@Vedom:显示语法错误:df.sort($"Time1", $"Time2".desc) SyntaxError: invalid syntax在$符号处
kaks

@kaks,需要如上所述导入函数/隐式函数以避免该错误
Rimer

41

仅PySpark

想要在PySpark中做同样的事情时,我碰到了这篇文章。最简单的方法是只添加参数ascending = False:

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

参考:http : //spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html#pyspark.sql.DataFrame.orderBy


8
这个问题标有scala标记,但是此答案仅适用于python,因为此语法以及函数签名仅适用于python。
Viacheslav Rodionov

1
谢谢!正在寻找PySpark版本。
arrkaye

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

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

1
这是@AmitDubey 3年前的重复答案。应该被删除以支持那个。
javadba


2

对于Java:

如果我们使用DataFrames,则在应用联接(此处为内部联接)时,可以在每个DF中选择不同的元素后(在ASC中)排序为:

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

哪里 e_id在ASC中按薪水排序时,应用联接的列在。

另外,我们可以将Spark SQL用作:

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

哪里

  • spark-> SparkSession
  • 工资-> GlobalTemp视图。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.