我想弄清楚獲取Spark數據框列中最大值的最佳方法。獲取Spark數據框列中最大值的最佳方法
請看下面的例子:
df = spark.createDataFrame([(1., 4.), (2., 5.), (3., 6.)], ["A", "B"])
df.show()
它創建:
+---+---+
| A| B|
+---+---+
|1.0|4.0|
|2.0|5.0|
|3.0|6.0|
+---+---+
我的目標是要找到A列中的最大值(通過檢查,這是3.0)。使用PySpark,這裏是我能想到的四種方法:
# 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]
上述每一個給出了正確的答案,但在沒有火花分析工具的我不能告訴這是最好的。
來自直覺或經驗主義的任何想法,對於上述哪些方法在Spark運行時或資源使用方面最有效,或者是否存在比上述方法更直接的方法?
方法2和3相同,使用相同的物理和優化邏輯計劃。方法4將rdd中的max應用於reduce。它可能比直接在DataFrame上運行要慢。方法1或多或少相當於2和3. – zero323
@ zero323那麼'df.select(max(「A」))。collect()[0] .asDict()['max(A)']'?看起來相當於方法2,而更緊湊,也更直觀,方法3。 – desertnaut
- 最慢的是方法4,因爲您對DF進行了整個列的RDD轉換,然後提取最大值; –