Apache Flink:如何在ReduceFunction中访问广播变量?

时间:2018-12-21 11:53:16

标签: apache-flink

我有一个只有一个条目的DataSet。我需要在reduce函数中使用这个值(阈值)。 flink文档显示了如何使用以下方法将数据集广播到地图函数:

data.map.withBroadcastSet(dataSetToBroadcast, "broadcastSetName");

并通过以下命令在map函数内部访问它:

@Override
public void open() {
  Collection<Integer> broadcastSet = getRuntimeContext().getBroadcastVariable("broadcastSetName");
}

看来这仅适用于RichMapFunctions,但我想在Reduce函数中访问此广播变量。当我在我的reduce函数中编写open函数时,出现错误“ Method不会从其超类重写method”。

我知道在缩小之前,我可以在map函数中接收广播,但是随后我必须将其添加到数据集中的每个条目中,这是开销。我也使用了flatMapFunction,其中也没有打开功能。

我也不想收集一个值以将其传递给reduce函数。

有人知道在reduce函数中可访问我的一个值的另一种方法吗? 谢谢

1 个答案:

答案 0 :(得分:2)

通过RuntimeContext访问广播集。可以通过调用RuntimeContext获得RichFunction.getRuntimeContext()

Flink为大多数功能接口(包括RichReduceFunction)提供了“丰富的”变体。

只需实现RichReduceFunction,您就可以使用RuntimeContext的所有功能。