[ Spark ] DStream转换

DStream转换

无状态转化操作

​ 无状态转化操作就是把简单的 RDD 转化操作应用到每个批次上,也就是转化 DStream 中的每一个 RDD。部分无状态转化操作列在了下表中。注意,针对键值对的 DStream 转化操作(比如
reduceByKey())要添加 import StreamingContext._才能在 Scala 中使用。

​ 事实上每个 DStream 在内部是由许多 RDD(批次)组成,且无状态转化操作是分别应用到每个 RDD 上的。

object SparkStreaming06_State_Transform {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[4]").setAppName("StreamWordCount")
    val ssc = new StreamingContext(sparkConf, Seconds(3))

    val lines = ssc.socketTextStream("hadoop104", 9990)

    //Code:Driver端
    val newDS = lines.transform(
      rdd => {
        //Code:Driver端,周期性执行
        rdd.map(
          str=>{
            //Code:Executor端
            str
          }
        )
      }
    )

    //Code:Driver端
    val newDS1 = lines.map(
      data => {
        //Code:Executor端
        data
      })

    ssc.start()
    ssc.awaitTermination()

  }
}

有状态转化操作

UpdateStateByKey

UpdateStateByKey 原语用于记录历史记录,有时,我们需要在 DStream 中跨批次维护状态(例

如流计算中累加 wordcount)。

object SparkStreaming05_State {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[4]").setAppName("StreamWordCount")
    val ssc = new StreamingContext(sparkConf, Seconds(3))
    ssc.checkpoint("cp")

    val datas = ssc.socketTextStream("hadoop104", 9990)

    val mapDatas = datas.map((_, 1))

    //    mapDatas.reduceByKey(_+_).print()
        val result: DStream[(String, Int)] = mapDatas.updateStateByKey(
          (seq: Seq[Int], buff: Option[Int]) => {
            Option(buff.getOrElse(0) + seq.sum)
          }
        )
    result.print()

    ssc.start()
    ssc.awaitTermination()

  }
}

WindowOperations

Window Operations 可以设置窗口的大小和滑动窗口的间隔来动态的获取当前 Steaming 的允许
状态。所有基于窗口的操作都需要两个参数,分别为窗口时长以及滑动步长。

窗口时长:计算内容的时间范围;
滑动步长:隔多久触发一次计算。
注意:这两者都必须为采集周期大小的整数倍。

object SparkStreaming06_State_Window {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[4]").setAppName("StreamWordCount")
    //采集3s为一批数据,默认一批一计算
    val ssc = new StreamingContext(sparkConf, Seconds(3))

    val lines = ssc.socketTextStream("hadoop104", 9990)
    val wordToOne = lines.map((_, 1))

    //窗口大小为攒截至当前最新2批一计算
    //步长:隔多久触发计算 ,避免出现重复数据,只要>=窗口就没有重复数据,默认的步长为一批
    val windowDS = wordToOne.window(Seconds(6),Seconds(6))

    windowDS.reduceByKey(_+_).print()

    ssc.start()
    ssc.awaitTermination()

  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值