| /** |
| * 清洗完成的数据中包含一个用户的响应状态码,获取每一种状态码对应的访问量 |
| * 1、读取清洗完成的数据成为RDD[String] |
| * 2、可以把上一步得到的RDD通过map算子转换成一个键值对类型的RDD,以状态码为key 以不同用户的访问日志为value的数据 |
| * 3、键值对类型的RDD通过countByKey行动算子计算每种状态码的访问量(不灵活)。也可以使用aggregateByKey或者combineByKey实现访问量的统计 |
| */ |
| |
| object A3StatusCount { |
| def main(args: Array[String]): Unit = { |
| val sparkConf:SparkConf = new SparkConf().setAppName("demo02").setMaster("local[3]") |
| val sc:SparkContext = new SparkContext(sparkConf) |
| |
| val value: RDD[String] = sc.textFile("hdfs://node1:9000/dc") |
| val map = value.map((line: String) => { |
| val str: String = line.split(" ")(8) |
| (str, 1) |
| }) |
| val count = map.reduceByKey(_ + _) |
| count.foreach(println(_)) |
| |
| sc.stop() |
| } |
| } |
| object A3StatusCount { |
| def main(args: Array[String]): Unit = { |
| val sparkConf:SparkConf = new SparkConf().setAppName("demo02").setMaster("local[3]") |
| val sc:SparkContext = new SparkContext(sparkConf) |
| |
| val value: RDD[String] = sc.textFile("hdfs://node1:9000/dc") |
| |
| val map: RDD[(String, String)] = value.map((line: String) => { |
| val strs = line.split(" ") |
| (strs(8), line) |
| }) |
| val agg = map.aggregateByKey(0L)( |
| (a: Long, b: String) => { |
| a + 1L |
| }, |
| (a: Long, b: Long) => { |
| a + b |
| } |
| ) |
| agg.foreach(println(_)) |
| |
| sc.stop() |
| } |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?