Flink-电商用户行为分析(网站独立访客数(UV)的统计)

数据
链接:https://pan.baidu.com/s/1InfWoNYUeV1KYyvFS1aXuA
提取码:z3p4
统计流量的重要指标是网站的独立访客数(Unique Visitor,UV)。UV指的是一段时间(比如一小时)内访问网站的总人数,1 天内同一访客的多次访问只记录为一个访客。通过 IP 和 cookie 一般是判断 UV 值的两种方式。当客户端第一次访问某个网站服务器的时候,网站服务器会给这个客户端的电脑发出一个 Cookie,通常放在这个客户端电脑的C盘当中。在这个 Cookie中会分配一个独一无二的编号,这其中会记录一些访问服务器的信息,如访问时间,访问了哪些页面等等。当你下次再访问这个服务器的时候,服务器就可以直接从你的电脑中找到上一次放进去的Cookie 文件,并且对其进行一些更新,但那个独一无二的编号是不会变的。 当然,对于 UserBehavior 数据源来说,我们直接可以根据 userId 来区分不同的用户。
代码实现

import org.apache.flink.api.scala._
import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.streaming.api.scala.function.AllWindowFunction
import org.apache.flink.streaming.api.windowing.time.Time
import org.apache.flink.streaming.api.windowing.windows.TimeWindow
import org.apache.flink.util.Collector

//定义一个输入数据的样列类
case class UserBehavior(UserId:Long,itemId:Long,categoryId:Int,behavior:String,timestamp:Long)
//定义一个输入数据的样列类
case class UvCount(windowEnd:Long,uvCount:Long)

object UniqueVisitor {
  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    env.setParallelism(1)
    env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)

    //使用相对路径
    val resource = getClass.getResource("/UserBehavior.csv")
    val dataStream = env.readTextFile(resource.getPath)
      .map(data => {
        val dataArray = data.split(",")
        UserBehavior(dataArray(0).trim.toLong, dataArray(1).trim.toLong, dataArray(2).trim.toInt, dataArray(3).trim,
          dataArray(4).trim.toLong)
      }).assignAscendingTimestamps(_.timestamp * 1000L)
      .filter(_.behavior == "pv") //只统计pv操作
      //不做keyby直接timeWindowAll
      .timeWindowAll(Time.hours(1))
        .apply(new UvCountByWindow())


    dataStream.print("pv count")

    env.execute("page view job")
  }
}
class UvCountByWindow() extends AllWindowFunction[UserBehavior,UvCount,TimeWindow]{
  override def apply(window: TimeWindow, input: Iterable[UserBehavior],
                     out: Collector[UvCount]): Unit = {
    //定义一个scala set 用于保存所有的数据UserId并去重
    var idSet = Set[Long]()
    //把当前窗口所有数据的Id收集到set中,最后输出set的大小
    for (userBehavior <- input){
      idSet  += userBehavior.UserId
    }
    out.collect(UvCount(window.getEnd,idSet.size))
  }
}

Flink-电商用户行为分析(网站独立访客数(UV)的统计)_第1张图片

你可能感兴趣的:(Flink电商项目)