Tôi đang cố gắng tìm ra cách tốt nhất để có được giá trị lớn nhất trong cột dữ liệu Spark.Cách tốt nhất để lấy giá trị tối đa trong cột dữ liệu Spark
Hãy xem xét ví dụ sau:
df = spark.createDataFrame([(1., 4.), (2., 5.), (3., 6.)], ["A", "B"])
df.show()
nào tạo:
+---+---+
| A| B|
+---+---+
|1.0|4.0|
|2.0|5.0|
|3.0|6.0|
+---+---+
Mục tiêu của tôi là để tìm giá trị lớn nhất trong cột A (qua sự kiểm tra, đây là 3.0). Sử dụng PySpark, đây là bốn cách tiếp cận tôi có thể nghĩ:
# Method 1: Use describe()
float(df.describe("A").filter("summary = 'max'").select("A").collect()[0].asDict()['A'])
# Method 2: Use SQL
df.registerTempTable("df_table")
spark.sql("SELECT MAX(A) as maxval FROM df_table").collect()[0].asDict()['maxval']
# Method 3: Use groupby()
df.groupby().max('A').collect()[0].asDict()['max(A)']
# Method 4: Convert to RDD
df.select("A").rdd.max()[0]
Mỗi phòng trong số trên cho câu trả lời đúng, nhưng trong sự vắng mặt của một công cụ Spark profiling Tôi không thể nói đó là tốt nhất.
Bất kỳ ý tưởng nào từ trực giác hoặc kinh nghiệm về phương pháp nào ở trên là hiệu quả nhất về thời gian chạy Spark hoặc sử dụng tài nguyên hoặc liệu có phương pháp trực tiếp hơn các phương pháp trên không?
Phương pháp 2 và 3 tương đương và sử dụng các kế hoạch lôgic vật lý và tối ưu hóa giống nhau. Phương pháp 4 áp dụng giảm với tối đa trên rdd. Nó có thể chậm hơn hoạt động trực tiếp trên DataFrame. Phương pháp 1 ít nhiều tương đương với 2 và 3. – zero323
@ zero323 Còn về 'df.select (max (" A ")) thì thu thập() [0] .asDict() ['max (A)']'? Có vẻ tương đương với Phương pháp 2 trong khi nhỏ gọn hơn và cũng trực quan hơn với Phương pháp 3. – desertnaut
- Cách chậm nhất là phương pháp 4, vì bạn thực hiện chuyển đổi DF sang RDD của toàn bộ cột và sau đó trích xuất giá trị lớn nhất; –