1

什麼是優化的或性能最好的方法來解決下面的用例火花數據框中多列計算的優化方式?

考慮一個100萬行和100列的數據幀,其中我們的興趣是1列 - 消息。我需要根據消息中匹配關鍵字存在的條件構建3個新列。

  • 消息:對代碼開發堆棧溢出貢獻 一天
  • FLAG1關鍵詞增加一天:堆棧,懈怠
  • FLAG 2關鍵字:推特,臉譜,WhatsApp的
  • Flag3相同的關鍵字:流量,運行,增加

預期輸出:(message,flag1,flag2,flag3)堆棧溢出對代碼開發的貢獻日益增加,1,0,0

方法1

val tempDF = df.withColumn("flag1",computeFlag(col("message"))).withColumn("flag2",computeFlag(col("message"))).withColumn("flag3",computeFlag(col("message"))) 

方法2

val tempDF = df.withColumn("flagValues",computeMultipleFlags(col("message"))).withColumn("_tmp", split($"flagValues","#")).select($"message",$"_tmp".getItem(0).as("flag1"),$"_tmp".getItem(1).as("commercial"),$"_tmp".getItem(2).as("flag2"),$"_tmp".getItem(3).as("flag3")).drop("_tmp") 

UDF:computeFlag返回1或0基於相應的關鍵字列表

UDF的精確匹配:computeMultipleFlags到根據flag1,flag 2和an各個關鍵字的精確匹配返回1或0的#分隔結果d標誌3:示例1#0#0

我已經使用這兩種方法解決了問題,但看到/感覺方法2表現更好。請指教。

  • 星火數據幀默認情況下,並行但如何這種情況下對方法1.將FLAG1,FLAG2,Flag3相同的列 工作 並行或串行的計算?

  • 將引發數據幀自動並行處理我的輸入欄 「消息」:多個行的針對列多個線程
    計算?

回答

0

在這兩種情況下,你已經使用udf功能,這需要columnserializationdeserialization,服用而處理了寶貴的時間。

在你的第一個情況下,你已經使用withColumn稱爲相同udf三次,這意味着序列化和反序列化發生三次每個標記生成

在你的第二個情況下,你只定義了一個udf功能。所以很明顯,比第一個運行速度更快,效率更高。而且您已使用split函數,這是一個好兆頭。

Dataframe s的分佈於自然界,以便每個函數調用得到執行平行於每個executors但每個功能將得到執行順序即數據獲取並行但功能/任務依然順序

我希望解釋清楚

有使用Spark functions您的情況更好的解決方案,它不需要額外的序列化和反序列化在udf情況。您可以使用以下解決方案。

df.withColumn("_tmp", split($"message", " ")) 
    .select($"message", 
    when(array_contains($"_tmp", "stack") || array_contains($"_tmp", "slack"), "1").otherwise("0") as "flag1", 
    when(array_contains($"_tmp", "twitter") || array_contains($"_tmp", "facebook") || array_contains($"_tmp", "whatsapp"), "1").otherwise("0") as "flag2", 
    when(array_contains($"_tmp", "flow") || array_contains($"_tmp", "run") || array_contains($"_tmp", "increase"), "1").otherwise("0") as "flag3") 
    .show(false)