本文使用Spark统计某个用户使用设备的天数最多的设备ID,来源于朋友的面试题。
1.需求
日志格式
time:时间(yyyy-MM-dd HH:mm:ss)
eventid:时间ID
deviceid:设备ID
一次一条记录,例如:
2018-09-01 12:00:00 1 a
2018-09-01 12:00:00 2 a
2018-09-01 12:00:00 3 a
2018-09-01 12:00:00 1 b
2018-09-01 12:00:00 1 c
2018-09-01 12:00:00 2 c
2018-09-02 12:00:00 1 b
2018-09-02 12:00:00 2 b
2018-09-02 12:00:00 1 c
2018-09-02 12:00:00 2 c
2018-09-03 12:00:00 1 b
2018-09-04 12:00:00 1 a
第一天使用a三次,b一次,c两次
第二天使用b两次,c两次
第三天使用b一次
第四天使用a一次
统计结果为:
b设备使用3天,a设备使用2天,c设备使用2天
2.实现
2.1.数据分析
1、用户在某天使用了某个设备,不管使用了多少次都算一次,那么可以统计(设备ID,时间)进行去重。
比如:第一天的数据转换后应该是这样的
(a,2018-09-01)(b,2018-09-01)(c,2018-09-01)
2、转换为如上数据后就是一个WordCount了
map((_._1,1))
2.2.代码实现
object DiviceCount {
def main(args: Array[String]): Unit = {
//创建一个Config
val conf = new SparkConf()
.setAppName("DeviceCount")
.setMaster("local")
//核心创建SparkContext对象
val sc = new SparkContext(conf)
//WordCount
sc.textFile("D:\\workspaces\\idea\\hadoop\\spark\\data\\device.txt")
.map(line => {
val lines = line.split("\t")
val date = lines(0).substring(0, 10)
val device= lines(2)
(device, date)
})
.distinct()
.map(x => (x._1, 1))
.reduceByKey(_ + _)
.sortBy(_._2, false)
.foreach(println)
//停止SparkContext对象
sc.stop()
}
}
执行结果如下:
(b,3)
(a,2)
(c,2)