我尝试使用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;
我希望有人可以帮助我找到我的错误。
答案 0 :(得分:1)
还有一点需要补充,如果您使用的是最新的Spark 2.3.0版本,那么请使用以下软件包导入Optional来解决同样的问题。
Java代码:
import org.apache.spark.api.java.Optional;