我在Spark Streaming中创建了一个带有5个整数值的窗口。每经过一秒钟,窗口就会获得1个新值并丢失最旧值。 每次出现新值时,我都会计算窗口中值的平均值:
JavaDStream<Integer> average = values.map(new Function<Integer, Integer>() {
@Override
public Integer call(Integer a) throws Exception {
int b = a/5;
return b;
} });
所以平均值不断变化。
问题是,每当一个新值到达窗口时,我想将它与之前的平均值进行比较。如果这个新值远大于或小于平均值,我想放弃它并保持旧的平均值。如果没有,可以更新avarage。
我的问题是,如何存储此“旧平均值”,以便将其与窗口中的新值进行比较?
谢谢。
答案 0 :(得分:0)
您可以尝试类似以下内容:
它可能如下所示:
JavaPairDStream<Integer, Integer> pairedIntStream = values.mapToPair(
new PairFunction<Integer, Integer, Integer>() {
@Override
public Tuple2<Integer, Integer> call(Integer a) throws Exception {
return new Tuple2<Integer, Integer>(1, a);
} });
Function3<Integer, Optional<Integer>, State<Integer>, Integer> mappingFunction =
new Function3<Integer, Optional<Integer>, State<Integer>, Integer>() {
@Override
public Integer call(Integer s, Optional<Integer> value, State<Integer> state) {
int avg = value.orNull() / 5;
if(!state.exists() || state.get() < avg) {
state.update(avg);
return avg;
}
return state.get();
}
};
JavaMapWithStateDStream<Integer, Integer, Integer, Integer> mapWithStateDStream =
pairedIntStream.mapWithState(StateSpec.function(mappingFunc));