在JAVA的spark流中添加最大值和最小值?

在JAVA的spark流中添加最大值和最小值?,java,apache-spark,spark-streaming,Java,Apache Spark,Spark Streaming,我试图将max和min添加到spark数据流中的每个RDD中,每个RDD都是元组。我编写了以下代码,但不理解如何传递参数min和max。 有人能提出一种实现这种转变的方法吗? 我尝试了以下方法: JavaPairDStream<Tuple2<Long, Integer>, Tuple3<Integer,Long,Long>> sortedtsStream = transformedMaxMintsStream.transformToPair(new Sort2

我试图将max和min添加到spark数据流中的每个RDD中,每个RDD都是元组。我编写了以下代码,但不理解如何传递参数min和max。 有人能提出一种实现这种转变的方法吗? 我尝试了以下方法:

JavaPairDStream<Tuple2<Long, Integer>, Tuple3<Integer,Long,Long>> sortedtsStream = transformedMaxMintsStream.transformToPair(new Sort2());

class MinMax implements Function<JavaPairRDD<Tuple2<Long, Integer>, Integer>, JavaPairRDD<Tuple2<Long, Integer>, Tuple3<Integer, Long, Long>>>{
    Long max;
    Long min;
    @Override
    public JavaPairRDD<Tuple2<Long, Integer>, Tuple3<Integer, Long, Long>> call(JavaPairRDD<Tuple2<Long, Integer>, Integer> input) throws Exception {
        JavaPairRDD<Tuple2<Long,Integer>,Tuple3<Integer,Long,Long>> output;
        max = input.max(new CMP1())._1._1;
        min = input.min(new CMP1())._1._1;
        output = input.mapToPair(new maptoMinMax());
        return output   ;
    }
    class maptoMinMax implements PairFunction<Tuple2<Tuple2<Long, Integer>, Integer>, Tuple2<Long, Integer>, Tuple3<Integer, Long, Long>> {

        @Override
        public Tuple2<Tuple2<Long, Integer>, Tuple3<Integer, Long, Long>> call(Tuple2<Tuple2<Long, Integer>, Integer> tuple2IntegerTuple2) throws Exception {
            return new Tuple2<Tuple2<Long, Integer>, Tuple3<Integer, Long, Long>>(new Tuple2<Long, Integer>(tuple2IntegerTuple2._1._1,tuple2IntegerTuple2._1._2), new Tuple3<Integer, Long, Long>(tuple2IntegerTuple2._2, max,min));
        }
    }
}

我们可以使用
rdd.transform
在同一个rdd上应用多个操作,从而得出每个批次间隔的结果。我们将把这个结果添加到每个元组中(根据问题规范)

这会在每个块间隔生成一个RDD,如(随机数介于1和999之间,包括):

(258,(0998))(591,(0998))


Java版本在语义上是相同的,但由于所有这些元组对象,所以更加详细。

每个元组都有max/min的意图是什么?这是否意味着一条流线:1,3,5,4 2被转换为(1,1,1),(3,3,1),(5,5,1),(4,5,1),(2,5,1)??那有什么用呢?(看看数据很快就会变得重复,从而增加开销)-我想知道实际的问题是否是“如何计算(rdd或数据流)的有状态最小值/最大值”在我按时间戳对数据流排序后,我正在尝试识别rdd中的最后一个、第一个和最后一个键、值对。。这里的max和min实际上是时间戳。如果我错了,请纠正我,min和max将是整个RDD的min-max。因此,在您的示例中,我将得到(1,5,1),(3,5,1),(5,5,1),假设它们在相同的RDD中。是不是这样?所以我们的目的是获取每个批次间隔每个RDD的最小和最大时间戳的记录?我们假设记录没有特定的顺序,对吗?是的。。我能够使用消息中的时间戳成功地对记录进行排序。但是,我无法使用foreachRDD,以获取每个批次中每个RDD的最小值和最大值感谢您的回答,我相信这在技术上是正确的,我尝试在Java中实现相同的功能,但我遇到一个运行时错误,说找不到最小值和最大值函数。我正在使用spark-1.4。你能建议我如何解决这个问题吗?我在问题中添加了错误和Java代码。。如果可以,请看一下:)最小和最大运算是简单的数字运算。在javs中是数学。max(x,y)
15/06/18 11:05:06 INFO BlockManagerInfo: Added input-0-1434639906000 in memory on localhost:42829 (size: 464.0 KB, free: 264.9 MB)
15/06/18 11:05:06 INFO BlockGenerator: Pushed block input-0-1434639906000
Exception in thread "JobGenerator" java.lang.NoSuchMethodError: org.apache.spark.api.java.JavaPairRDD.max(Ljava/util/Comparator;)Lscala/Tuple2;
        at org.necla.ngla.spark_streaming.MinMax.call(Type4ViolationChecker.java:346)
        at org.necla.ngla.spark_streaming.MinMax.call(Type4ViolationChecker.java:340)
        at org.apache.spark.streaming.api.java.JavaDStreamLike$class.scalaTransform$3(JavaDStreamLike.scala:360)
        at org.apache.spark.streaming.api.java.JavaDStreamLike$$anonfun$transformToPair$1.apply(JavaDStreamLike.scala:361)
        at org.apache.spark.streaming.api.java.JavaDStreamLike$$anonfun$transformToPair$1.apply(JavaDStreamLike.scala:361)
        at org.apache.spark.streaming.dstream.DStream$$anonfun$transform$1$$anonfun$apply$21.apply(DStream.scala:654)
        at org.apache.spark.streaming.dstream.DStream$$anonfun$transform$1$$anonfun$apply$21.apply(DStream.scala:654)
        at org.apache.spark.streaming.dstream.DStream$$anonfun$transform$2$$anonfun$5.apply(DStream.scala:668)
        at org.apache.spark.streaming.dstream.DStream$$anonfun$transform$2$$anonfun$5.apply(DStream.scala:666)
        at org.apache.spark.streaming.dstream.TransformedDStream.compute(TransformedDStream.scala:41)
        at org.apache.spark.streaming.dstream.DStream$$anonfun$getOrCompute$1$$anonfun$1$$anonfun$apply$7.apply(DStream.scala:350)
        at org.apache.spark.streaming.dstream.DStream$$anonfun$getOrCompute$1$$anonfun$1$$anonfun$apply$7.apply(DStream.scala:350)
        at scala.util.DynamicVariable.withValue(DynamicVariable.scala:57)
        at org.apache.spark.streaming.dstream.DStream$$anonfun$getOrCompute$1$$anonfun$1.apply(DStream.scala:349)
        at org.apache.spark.streaming.dstream.DStream$$anonfun$getOrCompute$1$$anonfun$1.apply(DStrea
data.transform{rdd => 
     val mx = rdd.map(x=> (x,x)).reduce{case ((x1,x2),(y1,y2)) => ((x1 min y1), (x2 max y2))}
     rdd.map(elem => (elem,mx))                              
}