火花流聚合来计算平均值和最小值

时间:2016-04-13 06:12:42

标签: aggregation spark-streaming

我有一个DStream [String,Object]我需要每隔一分钟计算一次avg,min和max值。 Dstream是从kafka创建的,msg每隔一分钟发布一次。到目前为止,我有以下代码。

val reducedRecords =newRecords.reduceByKeyAndWindow(aggMetrics(_,_),Seconds(60))

reducedRecords.map{data => data._2}.foreachRDD { rdd =>      
  if (!rdd.isEmpty) {
    rdd.foreachPartition {
      iter => { 
        storeData(iter, confMap, ruleEng)
      }
    }
  }
}

} 

def aggMetrics(a:Object,b:Object) = {
a.copy(
    ts = math.min(a.ts,b.ts),
    minValue = math.min(a.minValue,b.minValue),
    maxValue = math.max(a.maxValue,b.maxValue),
    sum = a.value+b.value,
    count = a.count+b.count)
 }

 def storeData(iterator: Iterator[Object], confMap: Map[BackendAppSettings, String], ruleEng: StreamingEngine) = {
 // logic to store the data to db
 // while storing calculate avg using the sum/count

我的问题是......

1.这个代码在性能方面看起来不错,也有机会 数据分区时数据丢失的原因?

  1. 使用updatestatebykey是上述选项的更好选择吗?如果是,那么在这种情况下应该是什么更新功能。 感谢你的答案。
  2. 感谢。

0 个答案:

没有答案
相关问题