利用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 条评论
登录 后参与评论

相关文章

来自专栏calvin

【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--请求处理函数装饰器注册篇(5/8)【controller+action】

上篇文章把action的注册讲完了,但是我们的处理函数没有指定可接受的httpmethod,也没有别名上面的。下面我们使用typescript的特性之一装饰器来...

874
来自专栏安恒网络空间安全讲武堂

逆向专题 | Writeup分享一

逆向WP分享一 0x01.re4 首先我们先点开运行试玩一下,大意就是让你输入正确的用户名和密码就能拿到flag,接下来进入正题。 ? 丢进IDA中,先shi...

2239
来自专栏王亚昌的专栏

类静态指针的申请和释放

     如果类有一个静态成员指针变量,在进程中执行new或malloc操作分配了内存,进程退出前并不需要调用new或malloc,因为系统会自动进行释放。但这...

852
来自专栏机器学习从入门到成神

在MyEclipse中使用Junit 的方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

591
来自专栏烂笔头

Python标准库笔记(6) — struct模块

目录[-] 该模块作用是完成Python数值和C语言结构体的Python字符串形式间的转换。这可以用于处理存储在文件中或从网络连接中存储的二进制数据,以及其...

3905
来自专栏chenssy

【死磕 Spring】----- IOC 之解析 bean 标签:解析自定义标签

前面四篇文章都是分析 Bean 默认标签的解析过程,包括基本属性、六个子元素(meta、lookup-method、replaced-method、constr...

994
来自专栏Java 技术分享

Struts2 之 modelDriven & prepare 拦截器详解

3517
来自专栏Java Edge

MyBatis Generator 用法详解 XML配置详解 3. <generatorConfiguration>的子元素MyBatis Generator中文文档

3637
来自专栏逆向技术

框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解)

       框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解) 通过昨天的讲解,我们已经理解了运行时类型识别是什么. 比如  CObje...

1976
来自专栏郭少华

Spring boot Mybatis-XML方式通用Mapper插件之MyBatis Geneator详解(六)

Github地址:https://github.com/AlanWalkerGuo/GeneratorMapper

1083

扫码关注云+社区