如何在spark中执行增量广播连接

时间:2017-05-11 06:49:48

标签: apache-spark spark-dataframe

在进行广播加入时,即使已经广播了以前的版本,看起来整个DataFrame也会被重播。

考虑以下简单示例:

df3.join(broadcast(df1), on=cond, ,"left_outer")
df3.join(broadcast(df1.union(df2), on=cond, ,"left_outer")

我希望只播放df2部分,但好像整个DataFrame都是广播的。

与此相关的用例是df1,df2等表示散列映射的位置。

我的想法是,我有一个DataFrames流(例如,在DStream上由foreach生成),我需要在其上进行ETL。

ETL添加了另一个列,其中包含一些基于现有列的值(因此是广播连接)。根据以前的ETL,映射会一直更新(每次都有一个小的更新)。

此映射的一侧可能变得非常重要(例如,数百MB),但是,每次更新都相对较小(例如,几KB)。

有没有办法有效地执行广播加入(或任何其他富集方式),以便每次只播放新更新的记录?

1 个答案:

答案 0 :(得分:0)

据我所知,

broadcast(df1)

broadcast(df1.union(df2))

广播两个不同的变量。因为操作df1.union(df2)实际上创建了一个新的DataFrame,显然与df1不同。

虽然union操作创建的新DataFrame包含df1项,但broadcast()对它们的处理方式不同。并广播DataFrames。

因此从理论上讲,您必须完全广播两个DataFrame才能达到预期的效果。 希望这能解决你的疑虑。