2017-05-01 1 views
0

J'ai 2 bases de données dans Spark. Les deux ont un identifiant unique. La structure est la suivanteUn moyen efficace de faire une jointure entre les données lorsque le champ de jointure est unique

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] 

Je veux obtenir le résultat dataframe suivant:

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

Je peux utiliser sql étincelle pour le faire, mais je ne pense pas que ce soit la façon la plus efficace Les identifiants sont uniques.

Existe-t-il un moyen de stocker un dictionnaire clé/valeurs en mémoire pour rechercher la valeur basée sur la clé plutôt que de faire une jointure? Serait-il plus efficace que de faire une jointure?

+0

vous pouvez utiliser [variables de diffusion] (http://stackoverflow.com/questions/40673773/how-to-use-a- broadcast-collection-in-a-udf/40676271 # 40676271) comme tables de recherche si l'un de vos jeux de données n'est pas trop grand. – mtoto

Répondre

0

Si vous faites exploser le df2 en clé, paires de valeurs, la jointure devient facile et juste un groupBy est nécessaire.

Vous pouvez expérimenter d'autres agrégations & réductions pour plus d'efficacité/parallélisation

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"))