我正在使用Flink v.1.4.0
。
我正在使用DataSet
API,我想尝试的其中一项与Apache Spark
中广播变量的使用方式非常相似。
实际上,我想在DataSet
上应用地图功能,浏览DataSet
中的每个元素并在HashMap
中搜索它;如果搜索元素出现在Map中,则检索相应的值。
HashMap
非常大,我不知道(因为我甚至没有构建我的解决方案)它需要Serializable
同时传输和使用所有工作人员。< / p>
一般来说,我想到的解决方案看起来像这样:
Map<String, T> hashMap = new ... ;
DataSet<Point> points = env.readCsv(...);
points
.map(point -> hashMap.getOrDefault(point.getId, 0))
...
但我不知道这是否有效,或者它是否有效。在进行了一些搜索之后,我找到了一个更好的示例here,根据Broadcast
我们可以Flink
中的List
个变量来广播DataSet<Point> points = env.readCsv(...);
DataSet<Centroid> centroids = ... ; // some computation
points.map(new RichMapFunction<Point, Integer>() {
private List<Centroid> centroids;
@Override
public void open(Configuration parameters) {
this.centroids = getRuntimeContext().getBroadcastVariable("centroids");
}
@Override
public Integer map(Point p) {
return selectCentroid(centroids, p);
}
}).withBroadcastSet("centroids", centroids);
,如下所示:
.getBroadcastVariable()
但是,List
似乎仅适用于HashMap
。
mappings
的替代解决方案吗? [[0 0 1 1]
[0 1 0 1]]
多个广播变量吗?答案 0 :(得分:1)
hashMap
的值来自何处?另外两种可能的解决方案:
hashMap
。每条记录可能效率更高,但重复初始化逻辑。DataSet
,一个用于hashMap
值,第二个用于points
和desired join strategy这两个DataSet
。作为类比,您尝试执行的操作可以通过SQL查询SELECT * FROM points p, hashMap h WHERE h.key = p.id
来表达。