加入字段时在数据框架之间进行连接的有效方法是唯一的

时间:2017-05-01 19:36:31

标签: apache-spark join key-value

我在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)]

我可以使用spark sql这样做,但我不认为它是最有效的方式,因为ID是唯一的。

有没有办法在内存中存储键/值字典,以便根据键查找值而不是进行连接?它会比加入更有效吗?

1 个答案:

答案 0 :(得分: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"))