Scala 在多个值的火花流中使用reduceByKeyAndWindow

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:

对Spark Streaming中的reduceByKeyAndWindow函数有疑问。这可能很幼稚,我对Scala和Spark都是新手

解析数据后,我将此数据集设置为三列: 第1列:键, 第2栏:金额(长期), 第3列:计数(长)

是否有办法通过reduceByAndWindow函数运行此函数,并在指定窗口上获得第2列(金额)和第3列(计数)的总和

从我所读到的内容来看,reduceByAndWindow函数只需要两列(键、值),因此我目前正在创建两个数据集: 数据集1:键、金额和 数据集2:键,计数

然后,我给reduceByKeyAndWindow打了两次电话。如果我能只做一次就好了(要减少的参数是相同的amount和count列)


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

也许我在这里超出了范围,但这是我为一个类似于你的案例所做的。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)))

上面的函数将适用于ReduceByKayandWindow

Thx Knight71!这很好。创建了两个函数,一个用于添加,一个用于减去(用于窗口外的批处理)。然后在ReduceByKayandWindow中添加函数就足够简单了:ReduceByKayandWindow(aggregateFuncAdd,aggregateFuncSubtract,分钟(windowLength.toLong),Seconds(slideInterval.toLong),2)Thx Knight71!这很好。创建了两个函数,一个用于添加,一个用于减法(用于窗口外的批处理)。然后在ReduceByAndWindow中添加函数就足够简单了:ReduceByAndWindow(aggregateFuncAdd,aggregateFuncSubtract,Minutes)(windowLength.toLong),秒(slideInterval.toLong),2)