利用Apache Spark实现pv统计分析

摘 要

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

 

需求

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

利用Apache Spark实现pv统计分析

代码及思路

  1. **
  2.   * 简单的pv统计
  3.   */
  4. object PageView {
  5.   def main(args: Array[String]): Unit = {
  6.     if (args.length < 2) {
  7.       System.err.println("Usage: <file>")
  8.       System.exit(1)
  9.     }
  10.     val conf = new SparkConf().setAppName("PageView")
  11.     val sc = new SparkContext(conf)
  12.     val rdd1 = sc.textFile(args(0)).map(line => {
  13.       //封装数据,数据封装为((a,b),c) key为元祖类型
  14.       val f = line.split("\t")
  15.       ((f(0), f(1)), 1)
  16.     })
  17.     //根据封装完的数据聚合一次。将相同的key加1
  18.     val rdd2 = rdd1.reduceByKey(_ + _)
  19.     //第二次封装,将host提取出,数据格式为(日期,域名,地址,点击量)
  20.     val rdd3 = rdd2.map(line => {
  21.       val url = line._1._2
  22.       val date = line._1._1
  23.       val host = new URL(url).getHost
  24.       (date, host, url, line._2)
  25.     })
  26.     //分组排序,根据域名分组,根据日期和点击量排序
  27.     //排序规则:日期升序,点击量降序
  28.     val rdd5 = rdd3.groupBy(_._2).mapValues(it => {
  29.       it.toList.sortBy(x => PVSort(x._1, x._4))
  30.     }).saveAsTextFile(args(1))
  31.     sc.stop()
  32.   }
  33. }
  34. /**
  35.   * 自定义排序,日期升序,点击量降序
  36.   *
  37.   * @param date
  38.   * @param count
  39.   */
  40. case class PVSort(date: String, count: Int) extends Ordered[PVSort] with Serializable {
  41.   override def compare(that: PVSort): Int = {
  42.     val i = this.date.compareTo(that.date)
  43.     if (i == 0) {
  44.       return -this.count.compareTo(that.count)
  45.     } else {
  46.       return i
  47.     }
  48.     /*val i = this.count.compareTo(that.count)
  49.     if (i == 0) {
  50.      return -this.date.compareTo(that.date)
  51.     } else {
  52.       return -i
  53.     }*/
  54.   }
  55. }

相关

利用Hadoop MapReduce实现pv统计分析

 

文件下载

广告也精彩
  • 利用Apache Spark实现pv统计分析已关闭评论
  • 92 views
  • A+
所属分类:未分类
avatar