36.Spark大型电商项目-用户访问session分析-session聚合统计之使用Scala实现自定义Accumulator

目录

代码

SessionAggrStatAccumulatorTest.scala

运行结果

本篇文章将介绍用户访问session分析-session聚合统计之使用Scala实现自定义Accumulator。

代码

SessionAggrStatAccumulatorTest.scala

package main.xxx.scala.spark

import main.xxx.java.constant.Constants
import main.xxx.java.util.StringUtils
import org.apache.spark.{AccumulatorParam, SparkConf, SparkContext}

/**
  * FileName: SessionAggrStatAccumulatorTest
  * Author:   hadoop
  * Email:    3165845957@qq.com
  * Date:     19-3-5 下午4:18
  * Description:
  *scala版本的自定义Accumulate
  */
object SessionAggrStatAccumulatorTest {

  def main(args: Array[String]): Unit = {
    /**
      * Scala中,自定义Accumulator
      * 使用object,直接定义一个伴生对象即可
      * 需要实现AccumulatorParam接口,并使用[]语法,定义输入输出的数据格式
      */

    object SessionAggrStatAccumulator extends AccumulatorParam[String] {

      /**
        * 首先要实现zero方法
        * 负责返回一个初始值
        */
       def zero(initialValue: String): String = {
         Constants.SESSION_COUNT + "=0|" + Constants.TIME_PERIOD_1s_3s + "=0|" + Constants.TIME_PERIOD_4s_6s + "=0|" + Constants.TIME_PERIOD_7s_9s + "=0|" + Constants.TIME_PERIOD_10s_30s + "=0|" + Constants.TIME_PERIOD_30s_60s + "=0|" + Constants.TIME_PERIOD_1m_3m + "=0|" + Constants.TIME_PERIOD_3m_10m + "=0|" + Constants.TIME_PERIOD_10m_30m + "=0|" + Constants.TIME_PERIOD_30m + "=0|" + Constants.STEP_PERIOD_1_3 + "=0|" + Constants.STEP_PERIOD_4_6 + "=0|" + Constants.STEP_PERIOD_7_9 + "=0|" + Constants.STEP_PERIOD_10_30 + "=0|" + Constants.STEP_PERIOD_30_60 + "=0|" + Constants.STEP_PERIOD_60 + "=0"

       }

      /**
        * 其次需要实现一个累加方法
        */
      def addInPlace(v1:String,v2:String):String ={
        //如果初始化值为空,那么返回v2
        if (v1 == ""){
          v2
        } else {
          //从现有的连接串中提取v2对用的值
          val oldValue = StringUtils.getFieldFromConcatString(v1,"\\|",v2)
          //累加1
          val  newValue = Integer.valueOf(oldValue)+1
          //给连接串的v2设置新的累加后的值
          StringUtils.setFieldInConcatString(v1,"\\|",v2,String.valueOf(newValue))

        }
      }
    }
    //创建spark上下文
    val conf = new SparkConf()
      .setAppName("SessionAggrStatAccumulatorTest")
      .setMaster("local")
    val  sc = new SparkContext(conf)

    // 使用accumulator()()方法(curry),创建自定义的Accumulator
    val sessionAggrStatAccumulator = sc.accumulator("")(SessionAggrStatAccumulator)

    // 模拟使用一把自定义的Accumulator
    val arr = Array(Constants.TIME_PERIOD_1s_3s,Constants.TIME_PERIOD_4s_6s)
    val rdd = sc.parallelize(arr,1)
    rdd.foreach(sessionAggrStatAccumulator.add(_))
    println(sessionAggrStatAccumulator.value)
  }



}

运行结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值