统计每个用户每小时的最大登录次数

数据文件

a,2020-07-11 10:51:12
a,2020-07-11 11:05:00
a,2020-07-11 11:15:20
a,2020-07-11 11:25:05
a,2020-07-11 11:45:00
a,2020-07-11 11:55:36
a,2020-07-11 11:59:56
a,2020-07-11 12:35:12
a,2020-07-11 12:58:59
b,2020-07-11 14:05:00
b,2020-07-11 14:51:12
b,2020-07-11 15:15:20
b,2020-07-11 15:25:05
b,2020-07-11 16:45:00
b,2020-07-11 16:55:36
b,2020-07-11 16:59:56
b,2020-07-11 17:35:12
b,2020-07-11 17:58:59

spark代码实现

package com.atguigu.homework

import java.text.SimpleDateFormat

import org.apache.spark.rdd.RDD
import org.apache.spark.{
    
    SparkConf, SparkContext}

/**
  * @ClassName: LogInTime
  * @Description:
  * @Author: kele
  * @Date: 2021/1/28 15:37
  **/
object LogInTime {
    
    

  def main(args: Array[String]): Unit = {
    
    

    val sc = new SparkContext(new SparkConf().setMaster("local[4]").setAppName("test"))

    //1、读取数据,
    val rdd = sc.textFile("E:\\小时登录次数.txt")

    // 2、  对数据进行切分,格式转换,方便后期使用
    val rdd2 = rdd.map(x=>{
    
    
      val id = x.split(",").head
      val datetime = x.split(",").last
      val sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
      val time = sdf.parse(datetime).getTime

      //返回值是用户id,时间的Long类型,
      (id,time)
    })
    //3、将同一用户分组,并且对时间进行排序,
    val rdd3:RDD[(String,List[Long])] = rdd2.groupByKey().map(x=>{
    
    

      val sorted = x._2.toList.sorted

      (x._1,sorted)
    })
    //4、判断一个用户一小时内的登录次数
    val rdd4=rdd3.map(x=>{
    
    
      //x是(a,list())
      //y是将要对比的时间,
      var num = x._2.map(y=>{
    
    
        // 使用过滤函数
        // z是一个个元素,将要与y对比  判断z大于y且z要小于y+3600000,或者z=y的留下
        x._2.filter(z=>{
    
    
          z>=y && z<y+3600000
        }).count(x=>x==x)
         //使用size会警告,不会影响程序正常运行
      }).sorted.take(1)
      (x._1,num)
    })
    println(rdd4.collect().toList)
  }
}

猜你喜欢

转载自blog.csdn.net/qq_38705144/article/details/113351582
今日推荐