日誌的數據結構概覽:
實現邏輯梳理:
- 取出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))
}
}