transform 原语允许 DStream上执行任意的RDD-to-RDD函数。
可以用来执行一些 RDD 操作, 即使这些操作并没有在 SparkStreaming 中暴露出来.
该函数每一批次调度一次。其实也就是对DStream中的RDD应用转换。
package com.gc.sparkStreaming.day01.transform
import kafka.serializer.StringDecoder
import org.apache.kafka.clients.consumer.ConsumerConfig
import org.apache.spark.SparkConf
import org.apache.spark.streaming.dstream.{DStream, InputDStream}
import org.apache.spark.streaming.kafka.KafkaUtils
import org.apache.spark.streaming.{Seconds, StreamingContext}
/**
* 无状态转换
* transform 原语允许 DStream上执行任意的RDD-to-RDD函数。
* 可以用来执行一些 RDD 操作, 即使这些操作并没有在 SparkStreaming 中暴露出来.
* 该函数每一批次调度一次。其实也就是对DStream中的RDD应用转换。
*/
// 需求从kafka 中接收数据 转成成rdd 进行计算
object TransformDemo {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setAppName("TransformDemo").setMaster("local[2]")
val streamingContext: StreamingContext = new StreamingContext(conf, Seconds(3))
// 创建kafka
val group: String ="guochao"
val brokers="hadoop102:9092,hadoop103:9092,hadoop104:9092"
val topic: String ="first"
val kafkaParams = Map(
ConsumerConfig.GROUP_ID_CONFIG->group ,
ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG->brokers
)
val kafkaInputStream: InputDStream[(String, String)] = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](
streamingContext,
kafkaParams,
Set(topic)
)
val resDstream: DStream[(String, Int)] = kafkaInputStream.transform(rdd => {
rdd.map(_._2).flatMap(_.split("\\W+")).map((_, 1)).reduceByKey(_ + _) // 对数据进行处理求wordcount
})
resDstream.print(100)
streamingContext.start();
streamingContext.awaitTermination()
}
}