根据用户访问网站的浏览时长统计每个用户:每天访问网站的总时长、当前天及前一天访问网站总时长、当前天访问的网站时长、访问网站的总时长

根据用户访问网站的浏览时长统计以下信息:
1、统计每个用户每天访问网站的总时长(当天总时长是累加之前日期的)
2、统计每个用户当前天及前一天访问网站总时长
3、统计每个用户当前天访问的网站时长(当前天统计的时长除了当前天访问的总时长还包含前一天和后一天的访问总时长)
4、统计每个用户访问网站的总时长
【1】数据 文件 userAccInfo.txt 数据如下
111    2019-06-20    1
111    2019-06-21    2
111    2019-06-22    3
222    2019-06-20    4
222    2019-06-21    5
222    2019-06-22    6
333    2019-06-20    7
333    2019-06-21    8
333    2019-06-22    9
444    2019-06-23    10

【2】scala代码实现

  1 package com.it.baizhan.scalacode.sparksql.examples
  2 
  3 import org.apache.spark.rdd.RDD
  4 import org.apache.spark.sql.SparkSession
  5 
  6 /**
  7   * +---+----------+---+
  8   * |uid|   accDate|dur|
  9   * +---+----------+---+
 10   * |111|2019-06-20|  1|
 11   * |111|2019-06-21|  2|
 12   * |111|2019-06-22|  3|
 13   * |222|2019-06-20|  4|
 14   * |222|2019-06-21|  5|
 15   * |222|2019-06-22|  6|
 16   * |333|2019-06-20|  7|
 17   * |333|2019-06-21|  8|
 18   * |333|2019-06-22|  9|
 19   * |444|2019-06-23| 10|
 20   * +---+----------+---+
 21   *  根据用户访问网站的浏览时长统计以下信息:
 22   *   1.统计每个用户每天访问网站的总时长(当天总时长是累加之前日期的)
 23   *
 24   *   2.统计每个用户当前天及前一天访问网站总时长
 25   *
 26   *   3.统计每个用户当前天访问的网站时长(当前天统计的时长除了当前天访问的总时长还包含前一天和后一天的访问总时长)
 27   *
 28   *   4.统计每个用户访问网站的总时长
 29   */
 30 
 31 case class AccInfo(uid:String,accDate:String,dur:Int)
 32 object UserDurInfo {
 33   def main(args: Array[String]): Unit = {
 34     val session = SparkSession.builder().master("local").appName("test").getOrCreate()
 35 
 36     val sc = session.sparkContext
 37     sc.setLogLevel("Error")
 38     val infos = sc.textFile("./data/userAccInfo.txt")
 39     val accInfoRDD: RDD[AccInfo] = infos.map(info => {
 40       val arr = info.split("\t")
 41       val uid = arr(0)
 42       val accDate = arr(1)
 43       val dur = arr(2).toInt
 44       AccInfo(uid, accDate, dur)
 45     })
 46     import session.implicits._
 47     val frame = accInfoRDD.toDF()
 48     frame.createTempView("accInfo")
 49 
 50     //1.统计每个用户每天访问网站的总时长(当天总时长是累加之前日期的)
 51     session.sql(
 52       """
 53         | select uid,accDate,sum(dur) over(partition by uid order by accDate ) as current_day_dur
 54         | from accInfo
 55       """.stripMargin).show()
 56 
 57     /**
 58      * +---+----------+---------------+
 59      * |uid|   accDate|current_day_dur|
 60      * +---+----------+---------------+
 61      * |111|2019-06-20|              1|
 62      * |111|2019-06-21|              3|
 63      * |111|2019-06-22|              6|
 64      * |444|2019-06-23|             10|
 65      * |222|2019-06-20|              4|
 66      * |222|2019-06-21|              9|
 67      * |222|2019-06-22|             15|
 68      * |333|2019-06-20|              7|
 69      * |333|2019-06-21|             15|
 70      * |333|2019-06-22|             24|
 71      * +---+----------+---------------+
 72      */
 73 
 74     //2.统计每个用户当前天及前一天访问网站总时长
 75     session.sql(
 76       """
 77         | select uid,accDate,sum(dur) over(partition by uid order by accDate rows between 1 preceding and current row ) as totalDur
 78         | from accInfo
 79       """.stripMargin).show()
 80 
 81     /**
 82      * +---+----------+--------+
 83      * |uid|   accDate|totalDur|
 84      * +---+----------+--------+
 85      * |111|2019-06-20|       1|
 86      * |111|2019-06-21|       3|
 87      * |111|2019-06-22|       5|
 88      * |444|2019-06-23|      10|
 89      * |222|2019-06-20|       4|
 90      * |222|2019-06-21|       9|
 91      * |222|2019-06-22|      11|
 92      * |333|2019-06-20|       7|
 93      * |333|2019-06-21|      15|
 94      * |333|2019-06-22|      17|
 95      * +---+----------+--------+
 96      */
 97 
 98     //3.统计每个用户当前天访问的网站时长(当前天统计的时长除了当前天访问的总时长还包含前一天和后一天的访问总时长)
 99     session.sql(
100       """
101         | select uid,accDate,sum(dur) over(partition by uid order by accDate rows between 1 preceding and 1 following) as totalDur
102         | from accInfo
103       """.stripMargin).show()
104 
105     /**
106      * +---+----------+--------+
107      * |uid|   accDate|totalDur|
108      * +---+----------+--------+
109      * |111|2019-06-20|       3|
110      * |111|2019-06-21|       6|
111      * |111|2019-06-22|       5|
112      * |444|2019-06-23|      10|
113      * |222|2019-06-20|       9|
114      * |222|2019-06-21|      15|
115      * |222|2019-06-22|      11|
116      * |333|2019-06-20|      15|
117      * |333|2019-06-21|      24|
118      * |333|2019-06-22|      17|
119      * +---+----------+--------+
120      */
121 
122   //4.统计每个用户访问网站的总时长
123     session.sql(
124       """
125         | select uid,sum(dur) as totaldur
126         | from accInfo
127         | group by uid
128       """.stripMargin).show()
129 
130     /**
131      * +---+--------+
132      * |uid|totaldur|
133      * +---+--------+
134      * |111|       6|
135      * |444|      10|
136      * |222|      15|
137      * |333|      24|
138      * +---+--------+
139      */
140 
141   //4.统计每个用户访问网站的总时长
142     session.sql(
143       """
144         | select distinct uid,sum(dur) over(partition by uid ) as totaldur
145         | from accInfo
146       """.stripMargin).show()
147 
148     /**
149      * +---+--------+
150      * |uid|totaldur|
151      * +---+--------+
152      * |111|       6|
153      * |444|      10|
154      * |222|      15|
155      * |333|      24|
156      * +---+--------+
157      */
158   }
159 }
 
posted @ 2021-03-04 16:36  大数据程序员  阅读(637)  评论(0编辑  收藏  举报