【Spark】(五)Spark Streaming 之 DStream 转换与输出

一、DStream 转换

DStream 上的操作与 RDD 的类似,分为 Transformations(转换)和 Output Operations(输出)两种,此外转换操作中还有一些比较特殊的原语,如:updateStateByKey()、transform()以及各种 Window 相关的原语。

1、无状态转化操作

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

  • 需要记住的是,尽管这些函数看起来像作用在整个流上一样,但事实上每个DStream在内部是由许多RDD(批次)组成,且无状态转化操作是分别应用到每个RDD上的。

  • 例如,reduceByKey()会归约每个时间区间中的数据,但不会归约不同区间之间的数据。

(1)Transform

Transform 允许 DStream 上执行任意的 RDD-to-RDD 函数。即使这些函数并没有在 DStream的 API 中暴露出来,通过该函数可以方便的扩展 Spark API。该函数每一批次调度一次。其实也就是对 DStream 中的 RDD 应用转换。

案例一:参数为一个,即transformFunc: RDD[T] => RDD[U]

object Transform {
   
  def main(args: Array[String]): Unit = {
   
      //创建 SparkConfval sparkConf: SparkConf = new
      SparkConf().setMaster("local[*]").setAppName("WordCount")
      //创建 StreamingContext
      val ssc = new StreamingContext(sparkConf, Seconds(3))
      //创建 DStream
      val lineDStream: ReceiverInputDStream[String] = ssc.socketTextStream("hadoopwei", 9999)
      //转换为 RDD 操作
      val wordAndCountDStream: DStream[(String, Int)] = lineDStream.transform(rdd =>
         {
   
            val words: RDD[String] = rdd.flatMap(_.split(" "))
            val wordAndOne: RDD[(String, Int)] = words.map((_, 1))
            val value: RDD[(String, Int)] = wordAndOne.reduceByKey(_ + _)
            value
         })

      //打印
      wordAndCountDStream.print
      //启动
      ssc.start()
      ssc.awaitTermination()
  }
}

案例二:参数为两个,即transformFunc: (RDD[T], Time) => RDD[U]

package cn.kgc.kb09.Spark
import java.text.SimpleDateFormat
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 SparkStreaming_Transform {
   
  def main(args: Array[String]): Unit = {
   
    val conf = new SparkConf().setMaster("local[2]").setAppName("KafkaDemo")
    val streamingContext = new StreamingContext(conf,Seconds(2))

    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 -> 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值