[英]Spark dataFrame taking too long to display after updating its columns
我有一個大約的數據幀。 400 萬行和 35 列作為輸入。
我對這個數據框所做的只是以下步驟:
因此,我們最終得到與我們開始時相同的數據幀(理論上)。
但是,我注意到如果我的給定列列表變得太大(超過 6 列),則輸出 dataFrame 變得無法操作。 即使是簡單的顯示也需要 10 分鍾。
這是我的代碼示例(df 是我的輸入數據幀):
for c in list_columns:
df = df.join(df.groupby(list_group_features).agg(sum(c).alias('sum_' + c)), list_group_features)
df = df.drop('sum_' + c)
這是由於 Spark 的內部工作原理及其惰性求值造成的。
當您調用groupby
、 join
、 agg
,Spark 會做什么,它將這些調用附加到df
對象的計划中。 因此,即使它沒有對數據執行任何操作,您也正在創建一個內部存儲在 Spark DataFrame 對象中的大型執行計划。
只有當你調用一個動作( show
、 count
、 write
等)時,Spark 才會優化計划並執行它。 如果計划太大,優化步驟可能需要一段時間才能執行。 還要記住,計划優化發生在驅動程序上,而不是執行程序上。 因此,如果您的驅動程序很忙或超載,它也會延遲火花計划優化步驟。
記住連接是 Spark 中的昂貴操作,無論是優化還是執行,這都是有用的。 如果可以,在單個 DataFrame 上操作時應始終避免連接,而應使用窗口功能。 僅當您連接來自不同來源(不同表)的不同數據框時,才應使用連接。
優化代碼的一種方法是:
import pyspark
import pyspark.sql.functions as f
w = pyspark.sql.Window.partitionBy(list_group_features)
agg_sum_exprs = [f.sum(f.col(c)).alias("sum_" + c).over(w) for c in list_columns]
res_df = df.select(df.columns + agg_sum_exprs)
對於大型list_group_features
和list_columns
列表,這應該是可擴展且快速的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.