Java 在Flink中播放HashMap
我使用的是Java 在Flink中播放HashMap,java,hashmap,apache-flink,Java,Hashmap,Apache Flink,我使用的是Flink v.1.4.0 我正在使用DataSetAPI,我想尝试的一件事与在apachespark中如何使用广播变量非常相似 实际上,我想在数据集上应用map函数,遍历数据集中的每个元素,并在HashMap中搜索它;如果地图中存在搜索元素,则检索相应的值 HashMap非常大,我不知道它是否需要Serializable才能被所有工作人员同时传输和使用(因为我还没有构建我的解决方案) 一般来说,我想到的解决方案如下: Map<String, T> hashMap = ne
Flink v.1.4.0
我正在使用DataSet
API,我想尝试的一件事与在apachespark
中如何使用广播变量非常相似
实际上,我想在数据集
上应用map函数,遍历数据集
中的每个元素,并在HashMap
中搜索它;如果地图中存在搜索元素,则检索相应的值
HashMap
非常大,我不知道它是否需要Serializable
才能被所有工作人员同时传输和使用(因为我还没有构建我的解决方案)
一般来说,我想到的解决方案如下:
Map<String, T> hashMap = new ... ;
DataSet<Point> points = env.readCsv(...);
points
.map(point -> hashMap.getOrDefault(point.getId, 0))
...
但是,.getBroadcastVariable()
似乎只适用于列表
- 是否有人可以提供一个具有
HashMap
的替代解决方案李>
- 这一解决方案将如何运作李>
- 解决这个问题最有效的方法是什么李>
- 可以使用Flink管理的状态来执行类似于广播变量使用方式的操作吗?怎么做李>
- 最后,我可以尝试在管道中使用多个广播变量进行多个
映射吗
hashMap
的值来自哪里?其他两种可能的解决办法:
hashMap
。每个记录可能更有效,但重复初始化逻辑数据集
,一个用于hashMap
值,第二个用于点
,这两个数据集
使用。作为类比,您试图做的事情可以通过SQL查询SELECT*从p点,hashMap h,其中h.key=p.id
来表示李>
你是对的——这很有道理;它甚至解释了为什么hashMaps不是广播变量API的一部分。我自己应该想到的。。。谢谢。我很高兴能帮上忙:)
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);