在Spark Streaming中对多个值

时间:2016-06-15 16:22:58

标签: scala apache-spark spark-streaming

对Spark Streaming中的reduceByKeyAndWindow函数有疑问。这可能是天真的,对Scala和Spark都是新的。

解析我的数据后,我有三列的数据集:   第1栏:钥匙,   第2栏:金额(长),   第3列:计数(长)

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

根据我的阅读,看起来reduceByKeyAndWindow函数只需要两列(键,值),所以我目前正在做的是创建两个数据集:    数据集1 :密钥,金额和&&    数据集2 :键,计数

然后,我两次调用reduceByKeyAndWindow。如果我可以做一次(减少的参数与金额和计数列相同)将会很棒

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

2 个答案:

答案 0 :(得分:4)

你可以轻松地做到。你必须映射到(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

答案 1 :(得分:0)

也许我在这里超出范围,但这是我为类似你的案件所做的。 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;
});

非常干净和可读。