将新值与Spark Streaming中之前的平均值进行比较

时间:2016-03-22 19:34:51

标签: java apache-spark spark-streaming

我在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。

我的问题是,如何存储此“旧平均值”,以便将其与窗口中的新值进行比较?

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以尝试类似以下内容:

  1. 创建一个&#34;键值DStream&#34;使用伪密钥(例如1)
  2. 使用mapWithState()存储最后的平均值并按照您的提及进行比较;返回您想要进一步使用的平均值
  3. 它可能如下所示:

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