【问题标题】:Use reduceByKeyAndWindow in Spark Streaming on multiple values在 Spark Streaming 中对多个值使用 reduceByKeyAndWindow
【发布时间】:2016-06-16 01:30:51
【问题描述】:

对 Spark Streaming 中的 reduceByKeyAndWindow 函数有疑问。这可能很幼稚,对 Scala 和 Spark 来说都是新事物。

解析我的数据后,我得到了这个包含三列的数据集: 第 1 列:键, 第 2 列:金额(多头), 第 3 列:计数(长)

有没有办法通过 reduceByKeyAndWindow 函数运行它并在指定窗口上获取第 2 列(数量)和第 3 列(计数)的总和?

根据我的阅读,reduceByKeyAndWindow 函数似乎只需要两列(键、值),所以我目前正在做的是创建两个数据集: 数据集 1:key、Amount && 数据集 2:key、Count

然后,我调用了reduceByKeyAndWindow 两次。如果我能做一次就好了(减少的参数与数量和计数列相同)

这个问题有意义吗?任何输入都会很棒!

【问题讨论】:

    标签: scala apache-spark spark-streaming


    【解决方案1】:

    你可以轻松做到。您必须映射到 (key,(v1,v2)),然后使用如下简单函数来 reduceByKeyAndWindow。

    val data = Array(("key1",(1L,2L)),("key1",(9L,1L)),("key2",(1L,2L)),("key2",(99L,11L)))
    
    val rdd = sc.parallelize(k)
    
    val aggregateFunc: ((Long, Long), (Long, Long)) => (Long, Long) = {
          case ((v1, w1), (v2, w2)) => {
             (v1 + v2, w1 + w2)
           }
        }
    rdd.reduceByKey(aggregateFunc).collect()
    // Array((key1,(10,3)), (key2,(100,13)))
    

    上述函数适用于reduceByKeyAndWindow

    【讨论】:

    • 谢谢 Knight71!这工作得很好。创建了两个函数,一个是加法,一个是减法(对于落在窗口外的批次)。然后很容易在 reduceByKeyAndWindow 中添加函数:reduceByKeyAndWindow(aggregateFuncAdd, aggregateFuncSubtract, Minutes(windowLength.toLong), Seconds(slideInterval.toLong), 2)
    【解决方案2】:

    也许我在这里超出了范围,但这是我为类似于您的案例所做的。 Java伪代码:

    //inside your pipeline
    private class AmountCountClass{
        private int amount;
        private int count;
        public AmountCountClass(int i,int j){
            amount=i;
            count=j;
        //various methods: get-set, increase-decrease,whatever you need
    }
    JavaPairDStream<Key,AmountCountClass> pairedAndReducedByKey= yourDStream.mapToPair( {
        return new Tuple2<yourKey, new AmountCountClass(initialAmount,initialCount);
    }).reduceByKeyAndWindow(windowTime,windowSlide, 
        reduceFunction(AmountCountClass arg0, arg1){ 
            arg0.sumAmount(arg1.getAmount());
            arg0.sumCount(arg1.getCount());
            return arg0;
    });
    

    非常干净易读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 2016-11-29
      • 1970-01-01
      • 2017-04-22
      • 2015-11-03
      • 2017-11-15
      • 1970-01-01
      相关资源
      最近更新 更多