我有一个只有一个条目的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函数中可访问我的一个值的另一种方法吗? 谢谢
答案 0 :(得分:2)
通过RuntimeContext
访问广播集。可以通过调用RuntimeContext
获得RichFunction.getRuntimeContext()
。
Flink为大多数功能接口(包括RichReduceFunction
)提供了“丰富的”变体。
只需实现RichReduceFunction
,您就可以使用RuntimeContext
的所有功能。