- 前言
在之前的学习中我们已经学习了如何用Structured Streaming处理Socket数据以及文本数据,今天我们来学习如何用Structured Streaming处理kafka数据
- 官网介绍
http://spark.apache.org/docs/latest/structured-streaming-kafka-integration.html
-
代码
需求:wordCount计算
//创建SparkSession
val spark: SparkSession = SparkSession.builder().appName("test01").master("local[*]").getOrCreate()
//设置日志级别
spark.sparkContext.setLogLevel("WARN")
//读取数据
//kafka.bootstrap.servers:设置kafka集群服务器
//subscribe:需要订阅的主题
//load:加载
val kafkaDatas: DataFrame = spark.readStream.format("kafka")
.option("kafka.bootstrap.servers", "node01:9092,node02:9092,node03:9092")
.option("subscribe", "test01")
.load()
//根据业务逻辑进行数据处理
//因为kafkaDatas的数据类型为Row我们需要把它转为String类型进行数据处理
import spark.implicits._
val datas: Dataset[(String, String)] = kafkaDatas.selectExpr("CAST(key As string)", "CAST(value As string)").as[(String, String)]
//处理数据 求出单词数量(WordCount)
//数据为一个元组 第二个元素才是我们想要到的数据
val words: Dataset[String] = datas.flatMap(x => x._2.split(" "))
val wordsDatas: Dataset[Row] = words.groupBy("value").count().sort($"count".desc)
//计算结果输出
//format:表示数据输出到哪里
//outputMode:表示输出哪些数据
//trigger:触发器
//start:开启任务
//awaitTermination:等待关闭
wordsDatas.writeStream
.format("console")
.outputMode("complete")
.trigger(Trigger.ProcessingTime(0))
.start()
.awaitTermination()
上面代码已经整合了kafka并且能够根据业务逻辑处理数据,接下来你只需要开启kafka将数据写入指定主题即可。如有什么疑问记得私聊小编哦