RDD应用实例之app版本升级分析

一、数据

2020-05-14,张三,王者荣耀,华为应用,北京,v1.0
2020-05-14,李四,王者荣耀,应用宝,北京,v1.2
2020-05-14,张三,王者荣耀,华为应用,天津,v1.2
2020-05-14,张三,王者荣耀,小米应用,天津,v2.0
2020-05-14,王五,阴阳师,app store,上海,v1.8
2020-05-14,张三,王者荣耀,小米应用,天津,v2.0
2020-05-14,王五,阴阳师,app store,上海,v1.9
2020-05-15,王五,阴阳师,app store,上海,v2.0
2020-05-15,王五,阴阳师,app store,上海,v2.3
2020-05-15,张三,王者荣耀,华为应用,北京,v2.0
2020-05-15,李四,王者荣耀,应用宝,北京,v1.2
2020-05-15,李四,王者荣耀,应用宝,北京,v1.5
2020-05-15,王五,阴阳师,app store,上海,v2.9

二、需求

需求:不考虑地区,列出版本升级情况
结果格式:日期,姓名,app,下载渠道,升级前版本,升级后版本

示例:
2020-05-15,张三,王者荣耀,华为应用,北京,v1.0
2020-05-15,张三,王者荣耀,华为应用,天津,v1.2
2020-05-15,张三,王者荣耀,华为应用,天津,v2.0
结果:
2020-05-15,张三,王者荣耀,应用宝,v1.0,v1.2
2020-05-15,张三,王者荣耀,应用宝,v1.2,v2.0

三、代码

	val conf=new SparkConf().setAppName("App Update").setMaster("local")
    val sc=new SparkContext(conf)

    val rdd=sc.textFile("E:\\data\\spark\\rdd\\test\\read\\app.log")
    val mapRdd=rdd.filter(line=>line.contains("v")).map(line=>{
      val arr=line.split(",",-1)
        ((arr(0),arr(1),arr(2),arr(3)), arr(5))
    })
    val keyRdd=mapRdd.groupByKey()
    val filterRdd=keyRdd.mapValues(line=>line.toList.distinct).filter(line=>line._2.length>1)
    val zipRdd=filterRdd.mapValues(line=>line.zip(line.tail))
    val resultRdd=zipRdd.flatMap(line=>{
       line._2.map(x=>{
          (line._1._1, line._1._2, line._1._3, line._1._4, x._1, x._2)
       })
    })
    resultRdd.foreach(println)

四、结果

(2020-05-14,张三,王者荣耀,华为应用,v1.0,v1.2)
(2020-05-15,李四,王者荣耀,应用宝,v1.2,v1.5)
(2020-05-14,王五,阴阳师,app store,v1.8,v1.9)
(2020-05-15,王五,阴阳师,app store,v2.0,v2.3)
(2020-05-15,王五,阴阳师,app store,v2.3,v2.9)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章