Spark spark分析数据的过程,案例网站日志统计用户访问时间

第一步、数据的读取(输入)

  将要处理的数据读取封装到一个集合RDD中(类比与Scala中List列表)

  val inputRDD = sc.textFile("…”)

第二步、数据处理(分析)

  调用集合RDD中函数(高阶函数)进行处理分析

  RDD ->函数 ->另外一个RDD :transformation函数

  val outpuRDD = inputRDD.#(#:基本就是List中函数)

  比如:

    map\flatMap\filter\reducebyKey

第三步、数据的输出(输出)

  调用RDD中函数,返回的不是RDD类型

  outputRDD.# :此类型函数称为Action函数

  foreach\count\sum\first


3步放在一起,就是链式编程

  sc.textFile(…).transformation().action


案例代码
object SparkAppTimeCountSpark {
  //会话时长常量
  val TIME_LENGTH_0010:String = "0-10"
  val TIME_LENGTH_1120:String = "11-20"
  val TIME_LENGTH_2130:String = "21-30"
  val TIME_LENGTH_3000:String = "30++"
  //scala程序的入口,也是spark application运行Driver
  def main(args: Array[String]): Unit = {

    val spark = SparkSession.builder
      .appName("Simple Application")
      .master("local[2]")
      .getOrCreate()
    spark.sparkContext.setLogLevel("WARN")

    //第一步:数据的读取(输入)
    val pageViewRDD: RDD[String] = spark.read.textFile("file:///D:/tmpData/page_views.data").rdd
    pageViewRDD.cache()
    println(s"count=${pageViewRDD.count()}")
    //第二步:数据的处理(分析)
    val timeLengthCountRDD: RDD[(String, Int)] = pageViewRDD.map(line =>{
      //分割
      val arr: Array[String] = line.split("\t")
      //将track_time 日期格式(2013-05-19 13:00:00),转换为时间戳,方便后期操作
      import java.text.SimpleDateFormat
      val time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(arr(0)).getTime

      //返回(session,时间戳)
      (arr(2),time)
    })
      //按照sessionId进行分组,得到每个会话 所有访问时间
      .groupByKey() //(String, Iterable[Long])
      .map{
      case(sessionId:String,iter:Iterable[Long])=>{
        //获取最大和最小track_time
        val maxTrackTime = iter.max
        val minTrackTime = iter.min
        //计算会话时长
        val timeLength = (maxTrackTime - minTrackTime)/1000.0

        //判定 时长 属于那个 时长段
        if(timeLength<10){
          (TIME_LENGTH_0010,1)
        }else if(timeLength <20){
          (TIME_LENGTH_1120,1)
        }else if(timeLength <30){
          (TIME_LENGTH_2130,1)
        }else{
          (TIME_LENGTH_3000,1)
        }
      }
    }
      .reduceByKey(_ + _)

    //第三步:数据的输出
    //timeLengthCountRDD.foreach(println)
    timeLengthCountRDD.coalesce(1).foreachPartition( item =>{
      println("----=========---")
      item.foreach(println)
    })
    /**
      * 在开发测试的时候,为了对每个spark application页面监控 查看 job的状态信息
      *  运行完了4040d端口就没了。
      *
      */
    //将缓存的数据释放出来
    pageViewRDD.unpersist()

    //开发测试的时候,为了对每个spark app页面监控查看job的执行情况,
    //spark app运行结束4040端口就没了
    Thread.sleep(1000000000)

    //关闭资源
    spark.stop()
  }
}
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值