对Spark Streaming中的reduceByKeyAndWindow函数有疑问。这可能是天真的,对Scala和Spark都是新的。
解析我的数据后,我有三列的数据集: 第1栏:钥匙, 第2栏:金额(长), 第3列:计数(长)
有没有办法通过reduceByKeyAndWindow函数运行它并获取指定窗口上的第2列(金额)和第3列(计数)的总和?
根据我的阅读,看起来reduceByKeyAndWindow函数只需要两列(键,值),所以我目前正在做的是创建两个数据集: 数据集1 :密钥,金额和&& 数据集2 :键,计数
然后,我两次调用reduceByKeyAndWindow。如果我可以做一次(减少的参数与金额和计数列相同)将会很棒
这个问题有意义吗?任何输入都会很棒!!
答案 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;
});
非常干净和可读。