[英]Cross join optimizations on AWS Glue/Spark
我有2個數據框:
df1 - 7 列(ID 和 VARCHAR),行:1,700,000
df2 - 7 列(ID 和 VARCHAR),行:25,000
需要找到所有可能的相似之處,沒有辦法跳過笛卡爾積。
AWS Glue:具有 10 個(或 20 個)G.1X Worker 的集群
已經針對 178 個分區進行了測試(當從更大的 df 過濾 df1 時,Spark 會即時計算)運行時間:10 小時......我停止了這項工作,但在 S3 上。 找到超過 999 個 part-XXX-YYYYY 文件。
問題:如果無法跳過交叉連接,如何優化 Glue/Spark 上的交叉連接?
使用以下方法和 Glue 配置,作業在 121 分鍾內完成:
膠水細節=>
工人=>G2.X
工人數量=> 50。您也可以嘗試使用 149,這應該在 35-45 分鍾內完成工作。
我創建了兩個文件:-
df1=> 7 columns rows: 1700000, size 140 MB (根據列大小,文件大小可能會有所不同)
df2=> 7 列行:25000,大小 2 MB
現在我已經將第一個 dataframe 分區為 42500。
我是如何獲得 42500-> 首先我創建了 DF1 和 1 條記錄,DF2 和 25000 並保存,交叉加入 output。
它是 3.5 MB 的文件,為了獲得最佳性能,最佳分區應該在 128 MB 左右。 假設您要將一個分區大小設為 150 MB。
現在從 1 條記錄生成的 output 是 3.5 MB,要制作 150 MB 的分區大小,我們需要大約。 每個分區 42 條記錄。 我們有 1700000 條記錄,這使得它大約。 40500 個分區。
對您來說,1 條記錄的大小可能會有所不同。 使用相同的方法來計算分區大小。 修復后,只需使用帶廣播的交叉連接即可。
df1.reparition(40500)
df.crossJoin(broadcast(df2))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.