Spark统计某用户使用天数最多的设备

本文使用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)

你可能感兴趣的:(Spark统计某用户使用天数最多的设备)