[英]OR condition in dataframe full outer join reducing performance spark/scala
我看到如果我的連接條件涉及OR子句,則需要很長時間才能使用AND子句。 我正在做fullouter加入。
我的單元測試沒有顯示出重大差異,但是當針對大型數據集運行時,它運行速度非常慢
df1.join(df2, expr("id1 = id2 AND amount1 = amount2"), "fullouter").cache()
以下運行時間較長,即幅度慢〜10倍
df1.join(df2, expr("id1 = id2 OR amount1 = amount2"), "fullouter").cache()
有什么想法嗎?
TL; DR預計這兩者之間的性能差異。
邏輯連接( AND
)可以表示為基於shuffle的操作(排序合並連接或隨機散列連接) - 這意味着必須根據連接中包含的所有表達式的哈希將每個記錄轉移到僅一個子分區條件。
雖然在最壞的情況下(所有連接鍵都是常量並且在兩個數據集之間匹配),但是可以將N * M與所有拖曳到單個分區的記錄進行比較,典型情況下,使用實際數據,應該更加高效,大致N + M比較。
邏輯析取( OR
)不能表示為簡單的基於隨機數的操作,因為可以匹配對不同桶的記錄散列*。 因此,Spark使用笛卡爾積,然后選擇總是多次傳輸每個記錄並進行N * M比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.