Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Flink中播放HashMap_Java_Hashmap_Apache Flink - Fatal编程技术网

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);