簡體   English   中英

Spark dataFrame 更新其列后顯示時間過長

[英]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 的內部工作原理及其惰性求值造成的。

當您調用groupbyjoinagg ,Spark 會做什么,它將這些調用附加到df對象的計划中。 因此,即使它沒有對數據執行任何操作,您也正在創建一個內部存儲在 Spark DataFrame 對象中的大型執行計划。

只有當你調用一個動作( showcountwrite等)時,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_featureslist_columns列表,這應該是可擴展且快速的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM