网站用户行为分析项目之会话切割(一)(中)

简介: 网站用户行为分析项目之会话切割(一)(中)

字段解释

session_id:唯一标识我们的会话

session_server_time:最早访问的那条session创建的时间

landing_url:对应第一个访问的URL,即同属于一个session的最早时间那个

domain:域名


数据解释

观察前面两个表格的数据,表一共有10条,表二的pageview_count与click_count字段的数据加起来正好也是10条的。


b. 定义Schema信息

既然我们是准备用Parquet格式进行存储,那么就要定义好我们的Schema,如:


{"namespace": "com.shaonaiyi.spark.session",
 "type": "record",
 "name": "TrackerLog",
 "fields": [
     {"name": "log_type", "type": "string"},
     {"name": "log_server_time", "type": "string"},
     {"name": "cookie", "type": "string"},
     {"name": "ip", "type": "string"},
     {"name": "url", "type": "string"}
 ]
}


{"namespace": "com.shaonaiyi.spark.session",
 "type": "record",
 "name": "TrackerSession",
 "fields": [
     {"name": "session_id", "type": "string"},
     {"name": "session_server_time", "type": "string"},
     {"name": "cookie", "type": "string"},
     {"name": "cookie_label", "type": "string"},
     {"name": "ip", "type": "string"},
     {"name": "landing_url", "type": "string"},
     {"name": "pageview_count", "type": "int"},
     {"name": "click_count", "type": "int"},
     {"name": "domain", "type": "string"},
     {"name": "domain_label", "type": "string"}
 ]
}


将上面的Schema信息保存成两个文件,分别是:TrackerLog.avscTrackerSession.avsc,现在我们的准备工作已经完成了,接下来我们就可以开始构建一个项目了。


0x02 编程实现


1. 构建Maven项目

本人博客里面有很多教程,这里不再重复,相信学到这里的人,已经对这些基础知识相当熟练。

需要注意的是:

1、包名要与前面Schema信息定义的一致,如我的是:com.shaonaiyi.spark.session,当然,你可以继续先操作,不创建包名先。


image.png


2. 编码前准备工作

a. 引入依赖及插件(完整pom.xml文件如下)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.shaonaiyi</groupId>
    <artifactId>spark-sessioncut</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>2.2.0</version>
            <!--<scope>provided</scope>-->
        </dependency>
        <dependency>
            <groupId>org.apache.parquet</groupId>
            <artifactId>parquet-avro</artifactId>
            <version>1.8.1</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <testExcludes>
                        <testExclude>/src/test/**</testExclude>
                    </testExcludes>
                    <encoding>utf-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>net.alchim31.maven</groupId>
                <artifactId>scala-maven-plugin</artifactId>
                <version>3.1.6</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.avro</groupId>
                <artifactId>avro-maven-plugin</artifactId>
                <version>1.7.7</version>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>schema</goal>
                        </goals>
                        <configuration>
                            <sourceDirectory>${project.basedir}/src/main/avro</sourceDirectory>
                            <outputDirectory>${project.basedir}/src/main/java</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id> <!-- this is used for inheritance merges -->
                        <phase>package</phase> <!-- 指定在打包节点执行jar包合并操作 -->
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>


b. 引入Avro Schema文件

将TrackerLog.avsc、TrackerSession.avsc两个文件上传到项目的avro文件夹(自己新创建)


c. 引入数据源文件并引入Scala SDK

将数据源文件(visit_log.txt、cookie_label.txt)复制到项目的data文件夹(自己新创建),因为在开发的时候,我们一般是先将一部分测试的数据上传到项目来测试,测试完成后,再将路径修改为HDFS上的路径即可,这是开发的流程。创建scala代码源文件夹并引入Scala SDK,下面是目前的项目结构,请参考:


image.png


3. 实现源数据的获取

a. 根据Schema文件生成Java对应的类(因为Maven里引入了avro-maven-plugin插件,所以直接点击Maven里的compile即可生成相应的类)


image.png


编译完后,可以看到已经生成了相对应的文件,而且自动创建了包:


image.png


b. 新建一个工具类RawLogParserUtil


package com.shaonaiyi.session
import com.shaonaiyi.spark.session.TrackerLog
/**
  * @Auther: shaonaiyi@163.com
  * @Date: 2019/9/12 09:40
  * @Description: 将每一行原始日志解析成TrackerLog对象
  */
object RawLogParserUtil {
  def parse(line: String): Option[TrackerLog] = {
    if (line.startsWith("#")) None
    else {
      val fields = line.split("\\|")
      val trackerLog = new TrackerLog()
      trackerLog.setLogType(fields(0))
      trackerLog.setLogServerTime(fields(1))
      trackerLog.setCookie(fields(2))
      trackerLog.setIp(fields(3))
      trackerLog.setUrl(fields(4))
      Some(trackerLog)
    }
  }
}
相关文章
|
8月前
|
数据挖掘
88 网站点击流数据分析案例(统计分析-键路径转化率分析)
88 网站点击流数据分析案例(统计分析-键路径转化率分析)
49 0
|
2月前
|
人工智能 算法 测试技术
【简历优化平台-03】轻字段信息的合理性及单独算法
【简历优化平台-03】轻字段信息的合理性及单独算法
|
2月前
|
存储 运维 安全
第十五章信息(文档)和配置管理(选择3分)
第十五章信息(文档)和配置管理(选择3分)
|
11月前
|
SQL Java 关系型数据库
从系统报表页面导出20w条数据到本地只用了4秒,我是如何做到的
最近有个学弟找到我,跟我描述了以下场景: 他们公司内部管理系统上有很多报表,报表数据都有分页显示,浏览的时候速度还可以。但是每个报表在导出时间窗口稍微大一点的数据时,就异常缓慢,有时候多人一起导出时还会出现堆溢出。 他知道是因为数据全部加载到jvm内存导致的堆溢出。所以只能对时间窗口做了限制。以避免因导出过数据过大而引起的堆溢出。最终拍脑袋定下个限制为:导出的数据时间窗口不能超过1个月。
|
JSON JavaScript 小程序
小程序里显示附近的人,云开发数据库实现附近的人,按照位置远近排序,附近多少公里内的好友
小程序里显示附近的人,云开发数据库实现附近的人,按照位置远近排序,附近多少公里内的好友
141 0
|
前端开发
给大家科普一泛二级程序前端几十套模板随机切换
​ 今天给大家分享几个小旋风蜘蛛池的泛二级程序网站站群模板,是无备案 新域名都可以用 老域名备案域名效果更好, 文章自动配图 关键词自动配图 泛二级程序模板是一款专门为了要从事相关工程方面工作的
99 0
|
数据采集 分布式计算 监控
网站流量日志分析—数据入库—含义和 ETL 本质解释|学习笔记
快速学习网站流量日志分析—数据入库—含义和 ETL 本质解释
393 0
网站流量日志分析—数据入库—含义和 ETL 本质解释|学习笔记
|
JSON 关系型数据库 大数据
电商项目之用户行为日志字段分析|学习笔记
快速学习电商项目之用户行为日志字段分析
288 0
|
存储 分布式计算 Java
网站用户行为分析项目之会话切割(一)(下)
网站用户行为分析项目之会话切割(一)(下)
150 0
网站用户行为分析项目之会话切割(一)(下)
|
存储 机器学习/深度学习 算法
网站用户行为分析项目之会话切割(一)(上)
网站用户行为分析项目之会话切割(一)(上)
145 0
网站用户行为分析项目之会话切割(一)(上)