SparkStreaming之单词计数实现在一次程序的运行中,两次发送相同的key可以进行累加

import org.apache.log4j.{Level, Logger}
import org.apache.spark.SparkConf
import org.apache.spark.streaming.dstream.ReceiverInputDStream
import org.apache.spark.streaming.{Seconds, StreamingContext}

object WordCountByUpdateBykey {
  def main(args: Array[String]): Unit = {
    /**
      * 这个地方设置的线程数至少是2,因为一个线程用来接收数据
      * 另外一个线程是用来处理数据的。
      * 如果你只写了一个线程,也不报错,只不过光是接收数据,不处理数据。
      */
val conf = new SparkConf().setMaster("local[2]").setAppName("test")

 //初始化一个StreamingContext
val ssc = new StreamingContext(conf,Seconds(1))

//选择控制台打印日志的类型
Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
    
    //将ssc持久化到hdfs上
ssc.checkpoint("hdfs://hadoop1:9000/streaming")

    //通过监听一个端口得到一个DStream流    数据的输入
    val DStream: ReceiverInputDStream[String] = ssc.socketTextStream("hadoop1",9999)
   
   //数据的处理
    val wordOneDstream = DStream.flatMap(_.split(","))
      .map((_, 1))
    /**
      *   updateFunc: (Seq[V], Option[S]) => Option[S]
      *   scala功底:  k,v  k:String  每一个单词  v:int 出现的次数
      *   根据方法的结构是需要我们传进入两个参数,还要有返回值
      *   参数一:Seq[V]   hadoop,1 hadoop,1 haodop,1
      *               对应这个key在这个批次里面出现的次数
      *               1,1,1
      *   参数二:Option[S]
      *           代表的是这个key,上一次的中间状态  4
      *
      *   返回值:Option[S]
      *            把这个key最后的结果返回去
      *
      *            Option:
      *              Some
      *              None
      */
    val wordCountDStream = wordOneDstream.updateStateByKey((values: Seq[Int], state: Option[Int]) :Option[Int]=> {
      val currentCount = values.sum
      val lastCount = state.getOrElse(0)
      Some(currentCount + lastCount)
})

    //数据的输出
    wordCountDStream.print()

    ssc.start()
    ssc.awaitTermination()
    ssc.stop()

  }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值