我們正在將大量本地運行的 Python ETL 代碼(使用 pandas)遷移到在 Databricks 上運行的 Spark。我們在執行許多后續連接的部分遇到了一些性能問題(該部分在 pandas 中運行良好)。
我們正在 Databricks 集群上以包的形式運行我們的代碼(在這個問題上很難分享孤立的作業代碼)。所有的連接隨后發生在一個函式中。
我們要連接的主資料框架并不是很大:44列的819.000條記錄。我們總共將 27 個其他資料框架連接到這個主資料框架,每個資料框架只向主資料框架添加 1 到 3 個額外列。
所有資料框架都在同一列(客戶唯一識別符號)上連接,這在主資料框架中是唯一的,并且不應該以任何方式出現偏差。
當我們在 databricks 集群上運行我們的完整代碼并試圖執行任何操作(如count()或display())時,問題出現了在所有連接運行后。一旦需要執行所有后續的連接,主資料框架上的簡單計數的運行時間就會爆炸,而我們不知道是怎么回事。
一些額外的資訊:
。- 集群是一個簡單的DS4_v2(28gb記憶體,8個核心),有2-8個作業節點。
- 將默認的shuffle磁區數量改為非常低的數字,如2,似乎沒有幫助 。
- 在連接之間存在和不存在的資料幀似乎沒有任何幫助 。
- 擴大或縮小集群似乎沒有什么幫助 。
下面是所有執行的連接的代碼。每個代碼塊都是一個獨立函式的一部分。這些函式隨后被我們在Databricks集群上呼叫的另一個函式所呼叫。df_pop是我們的主資料框架。
Join 1:
df_pop = df_pop.join(other_df1, df_pop.bc == other_df1.bc, how='left_outer')
Join 2 - 21 (在20個人口資料幀上回圈,并將每個資料幀連接到df_pop):
for pop in self.des_config.get('populations' ) 。
population = self.cleaned_data.get(pop).withColumnRenamed('bc', f'bc_{pop}') 。 select(col(f'bc_{pop}')
df_pop = df_pop.join(population, df_pop.bc == f'bc_{pop}', how = 'left_outer')
.withColumn(f'bc_{pop}', F.when(col(f'bc_{pop}). isNull(), F.lit(False)).otherwise(F.lit(True))
.withColumnRenamed(f'bc_{pop}'/span>, f'pop_{pop}'/span>)
加入22 - 25:
df_pop = df_pop.withColumn(f'pop_Real Estate'/span>, df_pop.bo_sector =='REAL ESTATE'/span>)
.withColumn(f'pop_O&O', df_pop.bo_sector == 'GOVERNMENT & EDUCATION')
.join(other_df2, on = 'bc', how = 'left_outer') .drop('other_df2.bc')
.join(other_df3, on = 'bc', how = 'left_outer') .drop('other_df3.bc')
.join(other_df4, on = 'bc', how = 'left_outer') .drop('other_df4.bc')
.join(other_df5, other_df5.bc == df_pop.bc, how = 'left_outer')
加入26:
df_pop = df_pop.join(other_df6, other_df6.bc == df_pop.bc, how ='Left_outer')
.fillna(False, subset=['pop_edr_backlog'])
加入27:
df_pop = df_pop.join(other_df7, other_df7.bc == df_pop.bc, how ='left_outer')
在這些連接之后,對df_pop的任何操作都不可能。有什么辦法可以解決這個問題嗎?
uj5u.com熱心網友回復:
我們剛剛解決了這個問題。在for-loop中執行的連接2-21顯然導致了 "廣播嵌套回圈連接",因為在連接之前發生了.withColumnRenamed。移除這個導致了 "廣播哈希連接 "的執行,這要快得多。因此,用 `df_pop.explain('formatted')檢查執行計劃,并檢查正在執行的連接型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/309440.html
標籤:
