- 前言
今天我們來學習如何用Structured Streaming讀取Socket數據,在學習讀取Socket數據之前呢,首先我們先擴展一些內容
- 擴展
spark 2.0中初步提供了一些內置的source支持。
Socket source: 從socket連接中讀取文本內容。
File source: 以數據流的方式讀取一個目錄中的文件。支持text、csv、json、parquet等文件類型。
Kafka source: 從Kafka中拉取數據,與0.10或以上的版本兼容,整合Kafka
通過以上內容我們可以看出 Structured Streaming可以讀取Socket ,File ,Kafka的數據,後面的博客我也會更新另外兩種方式的方法
- 準備工作
nc -lk 9999
hadoop spark sqoop hadoop spark hive hadoop
由上可以看出我們啓動了9999端口,並且在端口中輸入了一批數據,等下我們會在代碼中接收這批數據實行一個wordCount的效果
- Code
//創建SparkSession
val spark: SparkSession = SparkSession.builder().appName("test01").master("local[*]").getOrCreate()
//設置日誌級別
spark.sparkContext.setLogLevel("WARN")
//讀取最新數據 socketDatas內的數據爲Row類型
//host:連接的服務器IP地址
//port:連接的端口號
val socketDatas: DataFrame = spark.readStream.format("socket")
.option("host", "node01")
.option("port", "9999")
.load()
//根據業務邏輯進行數據處理
//轉換數據類型 因爲socketDatas的數據類型爲Row我們需要把他轉爲String類型盡心數據處理
import spark.implicits._
val strDatas: Dataset[String] = socketDatas.as[String]
//處理數據 求出單詞數量(WordCount)
val resDatas: Dataset[Row] = strDatas.flatMap(x => x.split(" ")).groupBy("value").count().sort($"count".desc)
//計算結果輸出
//format:表示數據輸出到哪裏
//outputMode:表示輸出哪些數據
//trigger:觸發器
//start:開啓任務
//awaitTermination:等待關閉
resDatas.writeStream
.format("console")
.outputMode("complete")
.trigger(Trigger.ProcessingTime(0))
.start()
.awaitTermination()
如上我已經把完整的代碼分享出來了,並且加上了完整的註釋 ,喜歡小編的朋友別忘了點個關注哦,我會繼續更新更好的內容分享出來