根据用户访问网站的浏览时长统计每个用户:每天访问网站的总时长、当前天及前一天访问网站总时长、当前天访问的网站时长、访问网站的总时长
根据用户访问网站的浏览时长统计以下信息:
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 }