Scala 在多个值的火花流中使用reduceByKeyAndWindow
对Spark Streaming中的reduceByKeyAndWindow函数有疑问。这可能很幼稚,我对Scala和Spark都是新手 解析数据后,我将此数据集设置为三列: 第1列:键, 第2栏:金额(长期), 第3列:计数(长) 是否有办法通过reduceByAndWindow函数运行此函数,并在指定窗口上获得第2列(金额)和第3列(计数)的总和 从我所读到的内容来看,reduceByAndWindow函数只需要两列(键、值),因此我目前正在创建两个数据集: 数据集1:键、金额和 数据集2:键,计数 然后,我给reduceByKeyAndWindow打了两次电话。如果我能只做一次就好了(要减少的参数是相同的amount和count列)Scala 在多个值的火花流中使用reduceByKeyAndWindow,scala,apache-spark,spark-streaming,Scala,Apache Spark,Spark Streaming,对Spark Streaming中的reduceByKeyAndWindow函数有疑问。这可能很幼稚,我对Scala和Spark都是新手 解析数据后,我将此数据集设置为三列: 第1列:键, 第2栏:金额(长期), 第3列:计数(长) 是否有办法通过reduceByAndWindow函数运行此函数,并在指定窗口上获得第2列(金额)和第3列(计数)的总和 从我所读到的内容来看,reduceByAndWindow函数只需要两列(键、值),因此我目前正在创建两个数据集: 数据集1:键、金额和 数据集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;
});
//在管道中
私有类AmountCountClass{
私人整数金额;
私人整数计数;
公共金额类(int i,int j){
金额=i;
计数=j;
//各种方法:设置、增加或减少,任何你需要的
}
JavaPairDStream pairedAndReducedByKey=yourDStream.mapToPair({
return new Tuple2可能我在这里超出了范围,但下面是我对类似于您的案例所做的操作。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;
});
//在管道中
私有类AmountCountClass{
私人整数金额;
私人整数计数;
公共金额类(int i,int j){
金额=i;
计数=j;
//各种方法:设置、增加或减少,任何你需要的
}
JavaPairDStream pairedAndReducedByKey=yourDStream.mapToPair({
返回新的Tuple2您可以很容易地完成它。您必须映射到(键,(v1,v2)),然后使用下面的简单函数来简化ByKeyAndWindow
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)))
上面的函数将适用于ReduceByAndWindow。您可以轻松地完成它。您必须映射到(键,(v1,v2)),然后使用下面的简单函数来ReduceByAndWindow
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)))
上面的函数将适用于ReduceByKayandWindowThx Knight71!这很好。创建了两个函数,一个用于添加,一个用于减去(用于窗口外的批处理)。然后在ReduceByKayandWindow中添加函数就足够简单了:ReduceByKayandWindow(aggregateFuncAdd,aggregateFuncSubtract,分钟(windowLength.toLong),Seconds(slideInterval.toLong),2)Thx Knight71!这很好。创建了两个函数,一个用于添加,一个用于减法(用于窗口外的批处理)。然后在ReduceByAndWindow中添加函数就足够简单了:ReduceByAndWindow(aggregateFuncAdd,aggregateFuncSubtract,Minutes)(windowLength.toLong),秒(slideInterval.toLong),2)