日志的数据结构概览:
实现逻辑梳理:
- 取出IP,生成一个只有IP的数据集
- 简单清洗
- 聚合:统计ip出现次数
- 按照ip出现次数排序,取出前十
代码实现:
创建AcesslogAgg类实现上述需求
package cn.ityuge.spark.rdd
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
import org.junit.Test
class AccessLogAgg {
@Test
def ipAgg: Unit ={
//1.spark入口
val conf = new SparkConf().setMaster("local[6]").setAppName("ip_agg")
val sc = new SparkContext(conf)
//2.读取文件,得到数据集
val rdd: RDD[String] = sc.textFile("file:///C:\\Users\\monster\\Desktop\\my_code\\spark\\data\\access_log_sample.txt")
//3.获取指定的ip数据集,并在每个后面加1
val rdd1 = rdd.map(item => (item.split(" ")(0),1))
//4 简单清洗
//4.1去除空的ip字段
// ....这里可以写很多的生产上的业务逻辑
val clearRdd = rdd1.filter(item=> !item._1.isEmpty)
//聚合
val aggRDD = clearRdd.reduceByKey((curr,age)=>curr+age)
//排序
val sortedRDD = aggRDD.sortBy(item =>item._2,ascending = false)
sortedRDD.take(10).foreach(item=>println(item))
}
}