Spark DataFrame group โดยและเรียงลำดับจากมากไปหาน้อย (pyspark)


90

ฉันใช้ pyspark (Python 2.7.9 / Spark 1.3.1) และมี dataframe GroupObject ซึ่งฉันต้องการกรองและเรียงลำดับจากมากไปหาน้อย พยายามที่จะบรรลุผ่านโค้ดชิ้นนี้

group_by_dataframe.count().filter("`count` >= 10").sort('count', ascending=False)

แต่มันแสดงข้อผิดพลาดต่อไปนี้

sort() got an unexpected keyword argument 'ascending'

คำตอบ:


173

ในเมธอด PySpark 1.3 sortไม่ใช้พารามิเตอร์จากน้อยไปมาก คุณสามารถใช้descวิธีการแทน:

from pyspark.sql.functions import col

(group_by_dataframe
    .count()
    .filter("`count` >= 10")
    .sort(col("count").desc()))

หรือdescฟังก์ชั่น:

from pyspark.sql.functions import desc

(group_by_dataframe
    .count()
    .filter("`count` >= 10")
    .sort(desc("count"))

ทั้งสองวิธีสามารถใช้ได้กับ Spark> = 1.3 (รวมถึง Spark 2.x)



25

วิธีที่สะดวกที่สุดคือใช้สิ่งนี้:

df.orderBy(df.column_name.desc())

ไม่ต้องการการนำเข้าพิเศษ


1
มอบเครดิตให้กับDaniel Havivสถาปนิกโซลูชั่นที่ Databricks ที่แสดงวิธีนี้
gdoron ให้การสนับสนุน Monica

1
คำตอบที่ดีที่สุดที่นี่
born_naked

นี่ควรเป็นคำตอบที่ยอมรับแทน simpeler มากและไม่พึ่งพาแพ็คเกจ (อาจจะไม่สามารถใช้งานได้ในเวลานั้น)
ไม่ระบุชื่อ

ฉันชอบคำตอบนี้มาก แต่ไม่ได้ผลสำหรับฉันด้วยการนับใน spark 3.0.0 ฉันคิดว่าเป็นเพราะการนับเป็นฟังก์ชันมากกว่าตัวเลข TypeError: อาร์กิวเมนต์ไม่ถูกต้องไม่ใช่สตริงหรือคอลัมน์: <วิธีการที่ถูกผูกไว้ DataFrame.count ของ DataFrame [... ]> ประเภท <class 'method'> สำหรับตัวอักษรของคอลัมน์ให้ใช้ฟังก์ชัน 'lit', 'array', 'struct' หรือ 'create_map'
Armando

5

ใน pyspark 2.4.4

1) group_by_dataframe.count().filter("`count` >= 10").orderBy('count', ascending=False)

2) from pyspark.sql.functions import desc
   group_by_dataframe.count().filter("`count` >= 10").orderBy('count').sort(desc('count'))

ไม่จำเป็นต้องนำเข้าใน 1) และ 1) สั้นและอ่านง่าย
ดังนั้นฉันจึงชอบ 1) มากกว่า 2)


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