1.首先,先看它的方法标签,主要传进来三个参数,第一个是一个updateFunc函数,这个函数很明确的告诉你这里面的输入值是 updateFunc: (Iterator[(K, Seq[V], Option[S])]) => Iterator[(K, S)],
输出值是Iterator[(K, S)]
另外一个参数就是分区器
下面主要介绍updateFunc这个函数是如何处理数据的,现在我们从实际场景出发,现在这个函数是有状态的,就意味着要保存上一次DStream的结果,利用上一个DStream的结果和最新的数据来进行按键规约,知道这里就好办了,下面我给一个代码实例
点击这里可以查看这个的案例
/**
* iter: 当前操作的RDD
* String: 聚合的key
* Seq[Int]: 在这个批次中此key在这个分区出现的次数集合 [1,1,1,1,1].sum()
* Option[Int]:初始值或累加值 Some None-> 模式匹配
*/
val updateFunc= ( iter:Iterator[ (String,Seq[Int] , Option[Int] ) ] ) =>{
//方案一:当成一个三元组运算
// iter.map( t=> ( t._1, t._2.sum+t._3.getOrElse(0) ) ) // -> { word:总次数}
//方案二: 模式匹配来实现
iter.map{ case(x,y,z)=>( x, y.sum+z.getOrElse(0) ) }
val reduced=wordAndOne.updateStateByKey( updateFunc, new HashPartitioner( ssc.sparkContext.defaultMinPartitions ), true)
}```