使用自定义累加器的目的:
如果要使用多个累加器的话,会使程序变的复杂,不便于扩展维护
代码实现
import org.apache.spark.{AccumulatorParam, SparkConf, SparkContext}
object CustomAccumulator extends AccumulatorParam[String] {
override def zero(initialValue: String): String = "SESSION_COUNT=0|TIME_PERIOD_1s_3s=0|TIME_PERIOD_4s_6s=0|STEP_PERIOD_1_3=0|STEP_PERIOD_4_6=0"
override def addInPlace(v1: String, v2: String): String = add(v1, v2)
// v1 : SESSION_COUNT=0|TIME_PERIOD_1s_3s=0|TIME_PERIOD_4s_6s=0|STEP_PERIOD_1_3=0|STEP_PERIOD_4_6=0
// v2 : TIME_PERIOD_1s_3s
// return: SESSION_COUNT=0|TIME_PERIOD_1s_3s=1|TIME_PERIOD_4s_6s=0|STEP_PERIOD_1_3=0|STEP_PERIOD_4_6=0
// 这里有三种情况:
// 1、最常见的情况。v1 = 上一次的累计值,v2 = 传入的一个字段
// 2、如果只有一个分区,在计算结束的时候,v1 &#