网站用户行为分析项目之会话切割(六)=> 参数配置化

2023-11-22 02:32

本文主要是介绍网站用户行为分析项目之会话切割(六)=> 参数配置化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家好,我是邵奈一,一个不务正业的程序猿、正儿八经的斜杠青年。
1、世人称我为:被代码耽误的诗人、没天赋的书法家、五音不全的歌手、专业跑龙套演员、不合格的运动员…
2、这几年,我整理了很多IT技术相关的教程给大家,主要是大数据教程,帮助了很多小伙伴入坑大数据行业。
3、如果您觉得文章有用,请收藏,转发,评论,并关注我,谢谢!
博客导航跳转(请收藏):邵奈一的技术博客导航
| 公众号 | 微信 | 微博 | CSDN | 简书 |


教程目录

  • 0x00 教程内容
  • 0x01 运行模式配置化
  • 0x02 路径配置化
  • 0x03 输出类型配置化
  • 0xFF 总结

0x00 教程内容

  1. 运行模式配置化
  2. 路径配置化
  3. 输出类型配置化

注意:以下代码均在 SessionCutETL 中修改。

0x01 运行模式配置化

目前我们是在本地运行的,如果是放到集群运行,则需要修改相应的代码,如果在本地测试,又要加上之前的代码,非常不方便。于是,我们可以给运行的模式加上参数适配。

(1)给设置运行模式加上判断条件:

conf.setMaster("local")
//修改为:
if(!conf.contains("spark.master")) {conf.setMaster("local")
}

0x02 路径配置化

目前我们的路径都是写死在代码里的,我们应该进行参数化处理,如果有传参数则使用传参的值,如果没有,则使用默认值。

(1)添加以下四行代码,并且需要修改代码里的路径:

// 通过配置拿到我们配置的输入和输出路径
val visitLogsInputPath = conf.get("spark.sessioncut.visitLogsInputPath", "data/rawdata/visit_log.txt")
val cookieLabelInputPath = conf.get("spark.sessioncut.cookieLabelInputPath", "data/cookie_label.txt")
val baseOutputPath = conf.get("spark.sessioncut.baseOutputPath", "data/output")

0x03 输出类型配置化

目前我们是直接把输出类型在代码中写死的,需要改进。
(1)添加一行代码,并修改代码里的字符串:

val outputFileType = if (args.nonEmpty) args(0) else "text"
// 修改输出代码为:
// text & parquet
OutputComponent.fromOutputFileType(outputFileType).writeOutputData(sc,baseOutputPath, parsedLogRDD, cookieLabeledSessionRDD)

完整代码如下:
(2)SessionCutETL 的完整代码如下:

package com.shaonaiyi.sessionimport com.shaonaiyi.spark.session.{TrackerLog, TrackerSession}
import org.apache.spark.rdd.RDD
import org.apache.spark.storage.StorageLevel
import org.apache.spark.{SparkConf, SparkContext}/*** @Auther: shaonaiyi@163.com* @Date: 2019/9/12 10:09* @Description: 会话切割的程序主入口*/
object SessionCutETL {private val logTypeSet = Set("pageview", "click")def main(args: Array[String]): Unit = {var conf = new SparkConf()conf.setAppName("SessionCutETL")if(!conf.contains("spark.master")) {conf.setMaster("local")}conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")var sc = new SparkContext(conf)// 通过配置拿到我们配置的输入和输出路径val visitLogsInputPath = conf.get("spark.sessioncut.visitLogsInputPath", "data/rawdata/visit_log.txt")val cookieLabelInputPath = conf.get("spark.sessioncut.cookieLabelInputPath", "data/cookie_label.txt")val baseOutputPath = conf.get("spark.sessioncut.baseOutputPath", "data/output")val outputFileType = if (args.nonEmpty) args(0) else "text"//网站域名标签数据,此处只是演示,其实可以存放在数据库里val domainLabelMap = Map("www.baidu.com" -> "level1","www.taobao.com" -> "level2","jd.com" -> "level3","youku.com" -> "level4")//广播val domainLabelMapB = sc.broadcast(domainLabelMap)// 1、加载日志源数据val rawRDD: RDD[String] = sc.textFile(visitLogsInputPath)//2、解析rawRDD中每一行日志源数据val parsedLogRDD: RDD[TrackerLog] = rawRDD.flatMap( line => RawLogParserUtil.parse(line)).filter(trackerLog => logTypeSet.contains(trackerLog.getLogType.toString))//缓存parsedLogRDDparsedLogRDD.persist(StorageLevel.MEMORY_AND_DISK)//3、按照cookie进行分组,一个cookie及一个userval cookieGroupRDD: RDD[(String, Iterable[TrackerLog])] = parsedLogRDD.groupBy(trackerLog => trackerLog.getCookie.toString)//4、生成会话RDDval sessionRDD: RDD[(String, TrackerSession)] = cookieGroupRDD.flatMapValues { case iter =>//处理每个user的日志val processor = new OneUserTrackerLogsProcessor(iter.toArray)
//      val processor = new OneUserTrackerLogsProcessor(iter.toArray) with PageviewSessionGeneratorprocessor.buildSessions(domainLabelMapB.value)}//5、给会话的cookie打标签val cookieLabelRDD: RDD[(String, String)] = sc.textFile(cookieLabelInputPath).map { case line =>val temp = line.split("\\|")(temp(0), temp(1)) // (cookie, cookie_label)}val joinRDD: RDD[(String,(TrackerSession, Option[String]))] = sessionRDD.leftOuterJoin(cookieLabelRDD)val cookieLabeledSessionRDD: RDD[TrackerSession] = joinRDD.map {case (cookie, (session, cookieLabelOpt)) =>if (cookieLabelOpt.nonEmpty) {session.setCookieLabel(cookieLabelOpt.get)} else {session.setCookieLabel("-")}session}//text & parquetOutputComponent.fromOutputFileType(outputFileType).writeOutputData(sc,baseOutputPath, parsedLogRDD, cookieLabeledSessionRDD)sc.stop()}}

0xFF 总结

  1. 网站用户行为分析项目系列:
    网站用户行为分析项目之会话切割(一)
    网站用户行为分析项目之会话切割(二)
    网站用户行为分析项目之会话切割(三)
    网站用户行为分析项目之会话切割(四)
    网站用户行为分析项目之会话切割(五)
    网站用户行为分析项目之会话切割(六)
  2. 下一篇文章我们会打包我们的代码放到集群去运行。

邵奈一 原创不易,如转载请标明出处,教育是一生的事业。


这篇关于网站用户行为分析项目之会话切割(六)=> 参数配置化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/406848

相关文章

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

maven私服配置全过程

《maven私服配置全过程》:本文主要介绍maven私服配置全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录使用Nexus作为 公司maven私服maven 私服setttings配置maven项目 pom配置测试效果总结使用Nexus作为 公司maven私

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地