利用Apache Spark实现pv统计分析

摘 要

本文将介绍通过Apache Spark实现离线统计网站每日pv的思路及代码。

需求

将数据按照域名分组,然后按照日期升序排序,点击量降续排序。

代码及思路

**
  * 简单的pv统计
  */

object PageView {

  def main(args: Array[String]): Unit = {
 if (args.length < 2) {
      System.err.println("Usage: <file>")
      System.exit(1)
    }

    val conf = new SparkConf().setAppName("PageView")
    val sc = new SparkContext(conf)
    val rdd1 = sc.textFile(args(0)).map(line => {
 //封装数据,数据封装为((a,b),c) key为元祖类型
      val f = line.split("\t")
      ((f(0), f(1)), 1)
    })
 //根据封装完的数据聚合一次。将相同的key加1
    val rdd2 = rdd1.reduceByKey(_ + _)
 //第二次封装,将host提取出,数据格式为(日期,域名,地址,点击量)
    val rdd3 = rdd2.map(line => {
      val url = line._1._2
      val date = line._1._1
      val host = new URL(url).getHost
      (date, host, url, line._2)
    })
 //分组排序,根据域名分组,根据日期和点击量排序
 //排序规则:日期升序,点击量降序
    val rdd5 = rdd3.groupBy(_._2).mapValues(it => {
      it.toList.sortBy(x => PVSort(x._1, x._4))
    }).saveAsTextFile(args(1))

    sc.stop()
  }

}

/**
  * 自定义排序,日期升序,点击量降序
  *
  * @param date
  * @param count
  */
case class PVSort(date: String, count: Int) extends Ordered[PVSort] with Serializable {
  override def compare(that: PVSort): Int = {

    val i = this.date.compareTo(that.date)
 if (i == 0) {
 return -this.count.compareTo(that.count)
    } else {
 return i
    }
 /*val i = this.count.compareTo(that.count)
    if (i == 0) {
     return -this.date.compareTo(that.date)
    } else {
      return -i
    }*/
  }
}

源数据下载

相关

利用Hadoop MapReduce实现pv统计分析

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏加米谷大数据

Redis数据存储优化机制详解

将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。省内存的原因是新建一个hash对象时开始是用zipmap来存储的。这个zipmap...

882
来自专栏AlgorithmDog的专栏

在 Spark 中实现单例模式的技巧

单例模式是一种常用的设计模式,但是在集群模式下的 Spark 中使用单例模式会引发一些错误。我们用下面代码作例子,解读在 Spark 中使用单例模式...

2715
来自专栏从流域到海域

《笨办法学Python》 第25课手记

《笨办法学Python》 第25课手记 本节课内容较多,如果不理解可以先尝试做正确,然后再来理解。我们的学习已经由最初的简单向复杂转变了,希望你能咬牙坚持下来,...

2046
来自专栏逍遥剑客的游戏开发

C++的反射和序列化

1192
来自专栏祝威廉

如何做Spark 版本兼容

同理对应的Vectors object 也是。这就造成了一个比较大的困难,比如下面的代码就很难做到兼容了,切换Spark就无法通过编译:

792
来自专栏SpringBoot

modal类(JavaBean)什么时候用到序列化(Serializable)

版权声明:本文为博主原创文章,未经博主允许不得转载。

852
来自专栏SDNLAB

Open vSwitch系列之数据结构解析深入分析ofpbuf

上一篇我们分析了hmap,hamp可以说是Open vSwitch中基石结构,很多Open vSwitch中数据结构都依赖hmap。本篇我们来分析一下ofpbu...

3548
来自专栏Flutter入门到实战

推特开源的Serial,轻量级,快速的json解析框架

你还在用Gson,fastjson吗?最近几个月推特开源了她们的json解析和序列化框架 Serial,这是一个轻量级框架,操作起来也很简单。下面简单的介绍一下...

1241
来自专栏牛肉圆粉不加葱

[源码剖析]Spark读取配置Spark读取配置

我们知道,有一些配置可以在多个地方配置。以配置executor的memory为例,有以下三种方式:

853
来自专栏Laoqi's Linux运维专列

正则三剑客-awk

awk与前两个不同之处是支持分段处理; #mkdir awk; cp /etc/passwd awk/passwd         //前期准备,创建一个awk...

2695

扫码关注云+社区