第一步、数据的读取(输入)
将要处理的数据读取封装到一个集合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()
}
}