美文网首页
Spark统计某用户使用天数最多的设备

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

作者: 阿坤的博客 | 来源:发表于2018-09-03 10:47 被阅读56次

    本文使用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统计某用户使用天数最多的设备

          本文链接:https://www.haomeiwen.com/subject/evkbwftx.html