• SparkStreming之updateStateByKey


    正文

      上一篇简单的写了一个socketTextStream的demo,这个问题就是每一次不能将之前和之后的数据进行合并统一。接下来我们通过demo进行把着这个问题解决。

      


    val conf = new SparkConf().setMaster("local[2]").setAppName("updateState")
    val sc: StreamingContext = new StreamingContext(conf, Seconds(2))

    sc.checkpoint("hdfs://hadoop01:9000/streamcp")
    val textStream: ReceiverInputDStream[String] = sc.socketTextStream("hadoop01", 9999)
    val map: DStream[(String, Int)] = textStream.flatMap(_.split(",")).map((_, 1))

    //目的在于将当前读取到的和上一次读取到的一样的key合并
    val dStream = map.updateStateByKey((value: Seq[Int], state: Option[Int]) => {
    //计算key此次出现的个数
    val currentCount = value.sum
    //上一次结果
    val lastCount = state.getOrElse(0)
    //因为看源码返回结果是Option[S],结果不是None就是Some,但是我们现在处理了所以只有Some即可
    Some(currentCount + lastCount)
    })

    dStream.print()

    sc.start()
    sc.awaitTermination()
    sc.stop()
    }
       

       通过代码中的注释已经算是对这个方法的解释了,因为他可以拿到上一个计算结果,同时能读到当前数据,进行合并就显得简单的多了sc.checkpoint("hdfs://hadoop01:9000/streamcp")此目的是为了搭配updateStateBykey使用,如果不加则会报错提示缺少checkpoint,我们创建了也会在hdfs的目录中看到这个节点,同时这个节点下会生产文件数据。

      

      这是在运行程序后不停的去checkpoint的数据,如下红色框中是此程序输入的内容

      

      然后我们的代码运行结果如下,可以看出来,每次输入的结果已经可以汇总出来。

      

                         Read more books, read good books

  • 相关阅读:
    ThinkPHP整合Kindeditor多图处理示例
    KindEditor用法介绍
    MySQL 1064 错误
    Nginx中虚拟主机与指定访问路径的设置方法讲解
    AJAX PHP无刷新form表单提交的简单实现(推荐)
    教PHP程序员如何找单位(全职+实习),超有用啊!
    利用正则表达式实现手机号码中间4位用星号(*)
    PHP项目做完后想上线怎么办,告诉你免费上线方法!
    备战NOIP——模板复习16
    备战NOIP——STL复习1
  • 原文地址:https://www.cnblogs.com/hackerxiaoyon/p/7545299.html
Copyright © 2020-2023  润新知