【Spark】(三)Spark Streaming 中的 Window操作

本文详细介绍了Spark Streaming中的Window操作,包括window、countByWindow、countByValueAndWindow、reduceByWindow和reduceByKeyAndWindow等算子的使用,强调了窗口长度、滑动时间与批量时间的关系,并指出在使用某些操作时需要设置checkpoint。
摘要由CSDN通过智能技术生成

Spark Streaming中的Window操作

窗口函数,就是在DStream流上,以一个可配置的长度为窗口,以一个可配置的速率向前移动窗口,根据窗口函数的具体内容,分别对当前窗口中的这一波数据采取某个对应的操作算子。

需要注意的是窗口长度,和窗口移动速率需要是batch time的整数倍。
在这里插入图片描述
**spark streaming 中有三个关于时间的参数,分别如下:
**

  • 窗口时间windowDuration:当前窗口要统计多长时间的数据,是批量时间的整数倍

  • 滑动时间slideDuration:要多长时间更新一次结果,是批量时间的整数倍

  • 批量时间batchDuration:多长时间创建一个批次,与实际业务无关,只与数据量有关,数据量大则可以设置短一些,数据量小则设置长一些,但必须小于其他两个时间。

1、window(windowLength, slideInterval)

该操作由一个DStream对象调用,传入一个窗口长度参数,一个窗口移动速率参数,然后将当前时刻当前长度窗口中的元素取出形成一个新的DStream。

package cn.kgc.kb09.Spark
import org.apache.kafka.clients.consumer.{
   ConsumerConfig, ConsumerRecord}
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{
   Seconds, StreamingContext}
import org.apache.spark.streaming.dstream.{
   DStream, InputDStream}
import org.apache.spark.streaming.kafka010.{
   ConsumerStrategies, KafkaUtils, LocationStrategies}

object SparkWindowDemo {
   
  def main(args: Array[String]): Unit = {
   
    val conf = new SparkConf().setMaster("local[2]").setAppName("KafkaDemo")
    val streamingContext = new StreamingContext(conf,Seconds(5))

    val kafkaParams: Map[String, String] = Map(
      (ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG -> "192.168.247.201:9092"),
      (ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG -> "org.apache.kafka.common.serialization.StringDeserializer"),
      (ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG -> "org.apache.kafka.common.serialization.StringDeserializer"),
      (ConsumerConfig.GROUP_ID_CONFIG, "kafkaGroup1")
    )

    val kafkaStream: InputDStream[ConsumerRecord[String, String]] =
      KafkaUtils.createDirectStream(
        streamingContext,
        LocationStrategies.PreferConsistent,
        ConsumerStrategies.Subscribe(Set("sparkKafkaDemo"), kafkaParams)
      )

    // 注意:窗口长度,窗口移动速率需要是batch time的整数倍
    val numStream: DStream[(String, Int)] =
      kafkaStream.flatMap(line => line.value().toString.split("\\s+"))
        .map((_, 1))
        .window(Seconds(20),Seconds(10))

    numStream.print()

    streamingContext.start()
    streamingContext.awaitTermination()
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值