基于 flink 的电商用户行为数据分析【5】| 基于埋点日志数据的网络流量统计

本文介绍了如何使用Flink基于埋点日志数据统计电商网站的网络流量,包括页面浏览量(PV)、独立访客数(UV)的统计,并探讨了使用布隆过滤器优化UV统计的方案,详细展示了不同统计方法的实现代码。
摘要由CSDN通过智能技术生成

本文已收录github:https://github.com/BigDataScholar/TheKingOfBigData,里面有大数据高频考点,Java一线大厂面试题资源,上百本免费电子书籍,作者亲绘大数据生态圈思维导图…持续更新,欢迎star!

前言

        在《基于flink的电商用户行为数据分析【3】| 实时流量统计》这篇文章中,博主为大家介绍了基于服务器 log 的热门页面浏览量统计。 最后通过运行结果的验证,我们发现,从 web 服务器 log 中得到的 url,往往更多的是请求某个资源地址(/*.js/*.css),如果要针对页面进行统计往往还需要进行过滤。而在实际电商应用中,相比每个单独页面的访问量,我们可能更加关心整个电商网站的网络流量。这个指标,除了合并之前每个页面的统计结果之外,还可以通过统计埋点日志数据中的“pv”行为来得到…

在这里插入图片描述
        本文首发链接:https://www.ebaina.com/articles/14000000503
        作者:Alice菌


网站总浏览量(PV)的统计

        衡量网站流量一个最简单的指标,就是网站的页面浏览量(Page View,PV)。用户每次打开一个页面便记录1次PV,多次打开同一页面则浏览量累计。一般来说,PV与来访者的数量成正比,但是PV并不直接决定页面的真实来访者数量,如同一个来访者通过不断的刷新页面,也可以制造出非常高的PV。

        我们知道,用户浏览页面时,会从浏览器向网络服务器发出一个请求(Request),网络服务器接到这个请求后,会将该请求对应的一个网页(Page)发送给浏览器,从而产生了一个PV。所以我们的统计方法,可以是从web服务器的日志中去提取对应的页面访问然后统计,就向上一节中的做法一样;也可以直接从埋点日志中提取用户发来的页面请求,从而统计出总浏览量。

        所以,接下来我们用UserBehavior.csv作为数据源,实现一个网站总浏览量的统计。我们可以设置滚动时间窗口,实时统计每小时内的网站PV。

UserBehavior.csv
        在src/main/scala下创建 PageView.scala 文件,具体代码如下:

object PageView {
   

  case class UserBehavior(userId: Long, itemId: Long, categoryId: Int, behavior: String, timestamp: Long)

  def main(args: Array[String]): Unit = {
   

    // 创建 流处理的 环境
    val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
    // 设置时间语义为 eventTime -- 事件创建的时间
    env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
    // 设置程序的并行度
    env.setParallelism(1)

    // 读取文本数据
    env.readTextFile("YOUR_PATH\\UserBehavior.csv")
      // 对文本数据进行封装处理
      .map(data => {
   

        val dataArray: Array[String] = data.split(",")
        // 将数据封装进 UserBehavior
        UserBehavior(dataArray(0).toLong,dataArray(1).toLong,dataArray(2).toInt,dataArray(3),dataArray(4).toLong)
      })
      // 设置水印
      .assignAscendingTimestamps(_.timestamp * 1000)
      // 过滤出 "pv" 数据
      .filter(_.behavior == "pv")
      // 求和
      .map(x => ("pv",1))
      .keyBy(_._1)
      // 设置TimeWindow,每一小时做一次聚合
      .timeWindow(Time.seconds(60 * 60))
      .sum(1)
      .print()

    // 执行程序
    env.execute("Page View Job")
  }
}

程序运行的结果:
在这里插入图片描述

网站独立访客数(UV)的统计

        在上节的例子中,我们统计的是所有用户对页面的所有浏览行为,也就是说,同一用户的浏览行为会被重复统计。而在实际应用中,我们往往还会关注,在一段时间内到底有多少不同的用户访问了网站

        另外一个统计流量的重要指标是网站的独立访客数(Unique Visitor,UV)。UV指的是一段时间(比如一小时)内访问网站的总人数,1天内同一访客的多次访问只记录为一个访客。通过IPcookie一般是判断UV值的两种方式。当客户端第一次访问某个网站服务器的时候,网站服务器会给这个客户端的电脑发出一个Cookie,通常放在这个客户端电脑的C盘当中。在这个Cookie中会分配一个独一无二的编号,这其中会记录一些访问服务器的信息,如访问时间,访问了哪些页面等等。当你下次再访问这个服务器的时候,服务器就可以直接从你的电脑中找到上一次放进去的Cookie文件,并且对其进行一些更新,但那个独一无二的编号是不会变的。

        当然,对于UserBehavior 数据源来说,我们直接可以根据userId来区分不同的用户。

        在src/main/scala下创建UniqueVisitor.scala文件,具体代码如下:

object UniqueVisitor {
   

  case class UserBehavior(userId: Long, itemId: Long, categoryId: Int, behavior: String, timestamp: Long)
  case class UvCount(windowEnd: Long, count: Long)

  def main(args: Array[String]): Unit = {
   

    // 创建 流处理的 环境
    val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
    // 设置时间语义为 eventTime -- 事件创建的时间
    env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
    // 设置程序的并行度
    env.setParallelism(1)

    // 读取文本数据
    env.readTextFile("YOUR_PATH\\UserBehavior.csv"
好的,针对电商用户行为分析的 Flink 代码解析,我可以提供一些简单的示例代码和解释,供您参考。 首先,我们需要定义用户行为数据数据模型,通常包括用户 ID、行为类型、商品 ID、时间戳等字段。示例代码如下: ```java public class UserBehavior { public long userId; public long itemId; public int categoryId; public String behavior; public long timestamp; } ``` 接下来,我们使用 Flink 处理框架来实时处理和分析用户行为数据。示例代码如下: ```java // 创建数据源,从 Kafka 中读取用户行为数据 FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<>("user-behavior", new SimpleStringSchema(), properties); DataStream<String> stream = env.addSource(consumer); // 将用户行为数据转换为 UserBehavior 对象 DataStream<UserBehavior> behaviorStream = stream.map(new MapFunction<String, UserBehavior>() { @Override public UserBehavior map(String value) throws Exception { JSONObject json = JSONObject.parseObject(value); return new UserBehavior( json.getLong("user_id"), json.getLong("item_id"), json.getInteger("category_id"), json.getString("behavior"), json.getLong("timestamp") ); } }); // 过滤浏览行为,并进行分组聚合 DataStream<Tuple2<Long, Long>> pvStream = behaviorStream .filter(new FilterFunction<UserBehavior>() { @Override public boolean filter(UserBehavior behavior) throws Exception { return behavior.behavior.equals("pv"); } }) .map(new MapFunction<UserBehavior, Tuple2<Long, Long>>() { @Override public Tuple2<Long, Long> map(UserBehavior behavior) throws Exception { return new Tuple2<>(behavior.itemId, 1L); } }) .keyBy(0) .sum(1); // 输结果到控制台 pvStream.print(); ``` 以上代码实现了从 Kafka 中读取用户行为数据,将数据转换为 UserBehavior 对象,过滤浏览行为,并按商品 ID 进行分组聚合,最后将结果输到控制台。 当然,电商用户行为分析还涉及到很多其他的问题和场景,如购买转化率分析、用户活跃度分析、商品热度排名分析等等。针对不同的问题和场景,需要进行不同的数据处理和分析。希望这个示例代码能够帮助您理解 Flink电商用户行为分析中的应用。
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据梦想家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值