在 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
对 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