0
我有一些昂貴的分析需要在對象的DataFrame上執行。設置看起來像這樣。爲什麼Spark SQL UDF比RDD慢?
# This does the expensive work and holds some reference data
# Expensive to initialize so done only once
analyze = Analyze()
def analyze_row(row):
# Turn the row into objects and pass them to the function above
foo = Foo.from_dict(row.foo.asDict(recursive=True))
bar = Bar.from_dict(row.bar.asDict(recursive=True))
return analyze(foo, bar)
當我申請analyze_row
作爲UDF像這樣
analyze_row_udf = udf(analyze_row, result_schema)
results_df = input_df.withColumn("result", analyze_row_udf).select("result.*")
它是憑經驗比它像這樣
results = content.rdd.map(analyze_row)
results_df = spark.createDataFrame(results, schema=result_schema)
所有其他條件相同,則UDF施加到RDD慢版本似乎沒有在一個小時內取得進展,而RDD版本在30分鐘內完成。在這兩種情況下,羣集CPU均已最大化。同樣的行爲在多次嘗試中被轉載。
我認爲DataFrames旨在取代RDD,部分原因是因爲性能更好。在這種情況下RDD似乎快得多?