2017-05-01 44 views
0

我在Spark中有2個數據框。他們都有一個獨特的ID。 結構如下當連接字段是唯一的時候,在數據框之間進行連接的有效方法

df1: 
id_df1 values 
abc  abc_map_value 
cde  cde_map_value 
fgh  fgh_map_value 


df2: 
id_df2 array_id_df1 
123  [abc, fgh] 
456  [cde] 

我希望得到以下數據幀結果:

result_df: 
id_df2  array_values 
123  [map(abc,abc_map_value), map(fgh,fgh_map_value)] 
456  [map(cde,cde_map_value)] 

我可以用火花SQL這樣做,但我不認爲這是最有效的方式ID是獨一無二的。

有沒有辦法在內存中存儲鍵/值字典來查找基於鍵的值而不是進行連接?它會比加入更有效嗎?

+0

您可以使用[廣播變量(http://stackoverflow.com/questions/40673773/how-to-use-a- broadcast-collection-in-a-udf/40676271#40676271)作爲查找表,如果你的數據集不是太大。 – mtoto

回答

0

如果將df2分解爲鍵值對,聯接變得簡單,只需要groupBy。

你可以嘗試其他聚合&減少了更多的效益/並行化

df2 
    .select('id_df2, explode('array_id_df1).alias("id_df1")) 
    .join(df1, usingColumn="id_df1") 
    .groupBy('id_df2) 
    .agg(collect_list(struct('id_df1, 'values)).alias("array_values")) 
相關問題