SparkCore案例一:数据过滤

1. 要求

1. 过去用户的行为日志数据中响应状态码大于等于400的数据
2. 并且需要查看一下合法的数据有多少条,不合法的数据有多少条
3. 将处理完成的结果保存到HDFS分布式文件存储系统上

2. 代码:使用自带累加器

/*
180.153.11.130
-
-
2018-03-18 11:42:44
"POST https://www.taobao.com/category/d HTTP/1.1"
200
12901
https://www.taobao.com/category/b
Google Chrome Chromium/Blinkwindows
山西
37.54
112.33
57
*/
object A1LogFilter {
  def main(args: Array[String]): Unit = {
    val sparkConf:SparkConf = new SparkConf().setAppName("demo02").setMaster("local[3]")
    val sc:SparkContext = new SparkContext(sparkConf)

    val rdd = sc.textFile("hdfs://node1:9000/opt/data/a.log")

    val accumulator = sc.longAccumulator
    val accumulator1 = sc.longAccumulator
    val value: RDD[String] = rdd.filter((line: String) => {
      val str = line.split(" ")
      if (str.length < 15) {
        accumulator.add(1L)
        false
      } else if (str(8).toInt >= 400) {
        accumulator1.add(1L)
        true
      } else {
        accumulator.add(1L)
        false
      }
    })
    value.saveAsTextFile("hdfs://node1:9000/clean")
    println(s"合法 ${accumulator1.value} 不合法 ${accumulator.value}")

    sc.stop()
  }
}

3. 代码二:使用自定义累加器

  • 主类:
object A1LogFilter {
  def main(args: Array[String]): Unit = {
    val sparkConf:SparkConf = new SparkConf().setAppName("demo02").setMaster("local[3]")
    val sc:SparkContext = new SparkContext(sparkConf)

    val rdd = sc.textFile("hdfs://node1:9000/opt/data/a.log")

//    val accumulator = sc.longAccumulator
//    val accumulator1 = sc.longAccumulator

    val accumutor = new A1Accumutor()
    val value: RDD[String] = rdd.filter((line: String) => {
      val str = line.split(" ")
      if (str.length < 15) {
//        accumulator.add(1L)
        accumutor.add("novalid")
        false
      } else if (str(8).toInt >= 400) {
//        accumulator1.add(1L)
        accumutor.add("valid")
        true
      } else {
        accumutor.add("novalid")
//        accumulator.add(1L)
        false
      }
    })
    value.saveAsTextFile("hdfs://node1:9000/clean")
//    println(s"合法 ${accumulator1.value} 不合法 ${accumulator.value}")
    println(accumutor.value)

    sc.stop()
  }
}
  • 自定义累加器:
package sparkcorerddexample

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/*
1、过滤用户的行为日志数据中响应状态码大于等于400的数据,
2、并且需要查看一下合法的数据多少条,不合法的数据有多少条 ----累加器(自定义累加器?其他累加器?  spark自带long类型)
如果使用自带的long类型累加器 需要两个    自定义累加器实现  1个
3、将处理完成的结果保存到HDFS分布书文件存储系统上

180.153.11.130
-
-
2018-03-18 11:42:44
"POST https://www.taobao.com/category/d HTTP/1.1"
200
12901
https://www.taobao.com/category/b
Google Chrome Chromium/Blinkwindows
山西
37.54
112.33
57
 */
object A1LogFilter {
  def main(args: Array[String]): Unit = {
    val sparkConf:SparkConf = new SparkConf().setAppName("demo02").setMaster("local[3]")
    val sc:SparkContext = new SparkContext(sparkConf)

    val rdd = sc.textFile("hdfs://node1:9000/opt/data/a.log")

//    val accumulator = sc.longAccumulator
//    val accumulator1 = sc.longAccumulator

    val accumutor = new A1Accumutor()
    val value: RDD[String] = rdd.filter((line: String) => {
      val str = line.split(" ")
      if (str.length < 15) {
//        accumulator.add(1L)
        accumutor.add("novalid")
        false
      } else if (str(8).toInt >= 400) {
//        accumulator1.add(1L)
        accumutor.add("valid")
        true
      } else {
        accumutor.add("novalid")
//        accumulator.add(1L)
        false
      }
    })
    value.saveAsTextFile("hdfs://node1:9000/clean")
//    println(s"合法 ${accumulator1.value} 不合法 ${accumulator.value}")
    println(accumutor.value)

    sc.stop()
  }
}
posted @ 2022-08-25 18:40  jsqup  阅读(117)  评论(0编辑  收藏  举报