在 Spark Streaming 中对多个值使用 reduceByKeyAndWindow

Use reduceByKeyAndWindow in Spark Streaming on multiple values

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

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

有没有一种方法可以通过 reduceByKeyAndWindow 函数 运行 并获得指定 window 的第 2 列(金额)和第 3 列(计数)的总和?

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

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

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

也许我在这里超出了范围,但这是我针对与您类似的案例所做的。 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;
});

非常简洁易读。

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