• SparkStreaming高级算子应用【combineByKey、transform,checkpoint】


    一.combineByKey算子简介

      功能:实现分组自定义求和及计数。

      特点:用于处理(key,value)类型的数据。

      实现步骤:

        1.对要处理的数据进行初始化,以及一些转化操作

        2.检测key是否是首次处理,首次处理则添加,否则则进行分区内合并【根据自定义逻辑】

        3.分组合并,返回结果

    二.combineByKey算子代码实战

     1 package big.data.analyse.scala.arithmetic
     2 
     3 import org.apache.spark.sql.SparkSession
     4 /**
     5   * Created by zhen on 2019/9/7.
     6   */
     7 object CombineByKey {
     8   def main (args: Array[String]) {
     9     val spark = SparkSession.builder().appName("CombineByKey").master("local[2]").getOrCreate()
    10     val sc = spark.sparkContext
    11     sc.setLogLevel("error")
    12 
    13     val initialScores = Array((("hadoop", "R"), 1), (("hadoop", "java"), 1),
    14                               (("spark", "scala"), 1), (("spark", "R"), 1), (("spark", "java"), 1))
    15 
    16     val d1 = sc.parallelize(initialScores)
    17 
    18     val result = d1.map(x => (x._1._1, (x._1._2, x._2))).combineByKey(
    19       (v : (String, Int)) => (v : (String, Int)), // 初始化操作,当key首次出现时初始化以及执行一些转化操作
    20       (c : (String, Int), v : (String, Int)) => (c._1 + "," + v._1, c._2 + v._2), // 分区内合并,非首次出现时进行合并
    21       (c1 : (String,Int),c2 : (String,Int)) => (c1._1 + "," + c2._1, c1._2 + c2._2)) // 分组合并
    22       .collect()
    23 
    24     result.foreach(println)
    25   }
    26 }

    三.combineByKey算子执行结果

      

    四.transform算子简介

      在spark streaming中使用,用于实现把一个DStream转化为另一个DStream。

    五.transform算子代码实现

     1 package big.data.analyse.streaming
     2 
     3 import org.apache.log4j.{Level, Logger}
     4 import org.apache.spark.SparkConf
     5 import org.apache.spark.streaming.{Seconds, StreamingContext}
     6 
     7 /**
     8   * Created by zhen on 2019/09/21.
     9   */
    10 object StreamingSocket {
    11 
    12   def functionToCreateContext():StreamingContext = {
    13     val conf = new SparkConf().setMaster("local[2]").setAppName("StreaingTest")
    14     val ssc = new StreamingContext(conf, Seconds(10))
    15     val lines = ssc.socketTextStream("192.168.245.137", 9999)
    16 
    17     val words = lines.flatMap(_.split(" "))
    18     val pairs = words.map(word=>(word,1))
    19 
    20     /**
    21       * 过滤内容
    22       */
    23     val filter = ssc.sparkContext.parallelize(List("money","god","oh","very")).map(key => (key,true))
    24 
    25     val result = pairs.transform(rdd => { // transform:把一个DStream转化为另一个SDtream
    26       val leftRDD = rdd.leftOuterJoin(filter)
    27       val word = leftRDD.filter( tuple =>{
    28         val y = tuple._2
    29         if(y._2.isEmpty){
    30           true
    31         }else{
    32           false
    33         }
    34       })
    35       word.map(tuple =>(tuple._1,1))
    36     }).reduceByKey(_+_)
    37 
    38     result.foreachRDD(rdd => {
    39       if(!rdd.isEmpty()){
    40         rdd.foreach(println)
    41       }
    42     })
    43     ssc.checkpoint("D:\checkpoint")
    44     ssc
    45   }
    46   Logger.getLogger("org").setLevel(Level.WARN) // 设置日志级别
    47   def main(args: Array[String]) {
    48     val ssc = StreamingContext.getOrCreate("D:\checkpoint", functionToCreateContext _)
    49 
    50     ssc.start()
    51     ssc.awaitTermination()
    52     ssc.stop()
    53   }
    54 }

    六.transform算子执行结果

      输入:

          

      输出:

        

      备注:若在执行流计算时报:Some blocks could not be recovered as they were not found in memory. To prevent such data loss, enable Write Ahead Log (see programming guide for more details.,可以清空checkpoint目录下对应的数据【当前执行生成的数据】,可以解决这个问题。

  • 相关阅读:
    循环
    rugarch包与R语言中的garch族模型
    Logistic回归
    机器学习缺失值处理方法汇总
    pandas库介绍之DataFrame基本操作
    python中常用的九种预处理方法
    谁动了我的特征?——sklearn特征转换行为全记录
    使用sklearn优雅地进行数据挖掘
    使用sklearn做单机特征工程
    彻底解决matplotlib中文乱码问题
  • 原文地址:https://www.cnblogs.com/yszd/p/11481923.html
Copyright © 2020-2023  润新知