所以我在DataStream上运行map函数,在map函数中我想要连接2个独立的DataSet。只是想知道这在Flink中是否可行。我知道map函数本身作为单独分区的单独任务运行,所以想知道在map函数中是否允许分布式连接?
答案 0 :(得分:1)
好的,事实证明你不能,因为加入DataSets发生在不同的上下文(ExecutionContext)而不是Stream处理(发生在StreamExecutionContext上),而Flink不允许在彼此内部使用不同的执行上下文。
datetime
答案 1 :(得分:1)
如果将dataSet1与dataSet2连接,而dataSet2不大。您可以使用withBroadcastSet运算符在dataSet1的映射中广播dataSet2。您可以使用getRuntimeContext()。getBroadcastVariable在地图函数中获取广播的dataSet2。然后,您可以在map函数中自行进行联接。为了加快连接速度,可以在广播dataSet2之前将dataSet2中的数据传输到地图中。例如:
Map<Integer, String> testMap = new HashMap<>();
dateSet2 = flinkEnv.fromElements(testMap);
dateSet1.map(new TestRichMapper()).withBroadcastSet(dateSet2, "dateSet2");
在RichMap函数中,您可以获取dateSet2并将其传输到地图中,如下所示:
Map<Integer, String> testMap = getRuntimeContext().getBroadcastVariable("dateSet2").toArray()[0];