Spark Streaming

时间:2016-12-05 14:24:49

标签: java apache-spark spark-streaming

我尝试使用Spark Streaming并希望拥有一个可在处理每个批处理后更新的全局状态对象。据我所知,至少有两种选择: 1.使用mapWithState,Spark将在每个批处理后自动更新状态 2.使用updateStateByKey函数,我必须自己调用更新

对我来说两种情况都没问题,但我两次都得到同样的错误。以下是我的示例代码以及它们的错误:

    Function3<String, Optional<Integer>, State<Integer>, Tuple2<String, Integer>> mappingFunc =
    new Function3<String, Optional<Integer>, State<Integer>, Tuple2<String, Integer>>() {
      @Override
      public Tuple2<String, Integer> call(String word, Optional<Integer> one,
          State<Integer> state) {
        int sum = one.orElse(0) + (state.exists() ? state.get() : 0);
        Tuple2<String, Integer> output = new Tuple2<>(word, sum);
        state.update(sum);
        return output;
      }
    };


    JavaMapWithStateDStream<String, Integer, Integer, Tuple2<String, Integer>> stateDstream =
    wordsDstream.mapWithState(StateSpec.function(mappingFunc).initialState(initialRDD));;
               Tuple2<String, Long> output = new Tuple2<>(word, sum);
               state.update(sum);
               return new String("Test");
        }
    });  

这个是取自Spark本身提出的例子。遗憾的是,我收到了关于StateSpec.function(...)

的以下错误
  

StateSpec类型中的方法函数(Function3&lt; KeyType,Optional&lt; ValueType&gt;,State&lt; StateType&gt;,MappedType&gt;)不适用于参数(Function3&lt; String,Optional&lt; Integer&gt;,State&lt; Integer&gt;,Tuple2&lt; ;字符串,整数&gt;&gt;)

使用:

JavaPairDStream<String, Long> runningCounts = processed.updateStateByKey(new Function2<List<Long>, Optional<Long>, Optional<Long>>() {
            public Optional<Long> call(List<Long> values, Optional<Long> state) {
                Long newSum = state.orElse((long)0);
                for(long x : values){
                    newSum +=x;
                }
                return Optional.of(newSum);
              });

导致类似错误:

  

类型JavaPairDStream中的方法updateStateByKey(Function2&lt; List&lt; Long&gt;,Optional&lt; S&gt;,Optional&lt; S&gt;&gt;&gt;)&lt;串,龙&GT;不适用于参数(new Function2&lt; List,Optional&lt; Long&gt;,Optional&lt; Long&gt;&gt;(){})

我的导入快照是:

import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.Function3;
import org.apache.spark.api.java.function.Function4;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction;
import org.apache.spark.api.java.function.VoidFunction2;

我希望有人可以帮助我找到我的错误。

1 个答案:

答案 0 :(得分:1)

还有一点需要补充,如果您使用的是最新的Spark 2.3.0版本,那么请使用以下软件包导入Optional来解决同样的问题。

Java代码:

import org.apache.spark.api.java.Optional;