จะจัดเรียงตามคอลัมน์จากมากไปหาน้อยใน Spark SQL ได้อย่างไร?


137

ฉันลองdf.orderBy("col1").show(10)แล้วแต่มันเรียงลำดับจากน้อยไปมาก df.sort("col1").show(10)ยังเรียงลำดับจากมากไปหาน้อย ผมมองใน StackOverflow และคำตอบที่ผมพบทั้งหมดล้าสมัยหรือเรียก RDDs ฉันต้องการใช้ดาต้าเฟรมดั้งเดิมในการจุดประกาย


2
เขาหมายถึง "df.sort (" col1 ") แสดง (10) เรียงลำดับจากน้อยไปมากด้วย "
Josiah Yoder

โซลูชันนี้ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน: stackoverflow.com/a/38575271/5957143
abc123

คำตอบ:


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.DataFrameสำหรับsortวิธีการ:

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

หมายเหตุ$และ.descด้านในsortสำหรับคอลัมน์เพื่อจัดเรียงผลลัพธ์ตาม


5
import org.apache.spark.sql.functions._และimport sqlContext.implicits._ยังมีฟังก์ชันดีๆมากมายให้คุณอีกด้วย
David Griffin

4
@Vedom: แสดงข้อผิดพลาดทางไวยากรณ์: df.sort($"Time1", $"Time2".desc) SyntaxError: invalid syntaxที่สัญลักษณ์ $
kaks

@kaks จำเป็นต้องนำเข้าฟังก์ชัน / นัยตามที่อธิบายไว้ข้างต้นเพื่อหลีกเลี่ยงข้อผิดพลาดนั้น
Rimer

41

PySpark เท่านั้น

ฉันเจอโพสต์นี้เมื่อต้องการทำแบบเดียวกันใน PySpark วิธีที่ง่ายที่สุดคือเพิ่มพารามิเตอร์จากน้อยไปมาก = 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
นี่เป็นคำตอบที่ซ้ำกันจาก 3 ปีก่อนหน้าโดย @AmitDubey ควรลบออกเพื่อสนับสนุนสิ่งนั้น
javadba


2

ในกรณีของ Java:

หากเราใช้DataFramesในขณะที่ใช้การรวม (ที่นี่การรวมภายใน) เราสามารถจัดเรียง (ใน ASC) หลังจากเลือกองค์ประกอบที่แตกต่างกันในแต่ละ DF เป็น:

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();

ที่ไหน

  • จุดประกาย -> SparkSession
  • เงินเดือน -> มุมมอง GlobalTemp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.