寫在前面:我是「雲祁」,一枚熱愛技術、會寫詩的大數據開發猿。暱稱來源於王安石詩中一句
[ 雲之祁祁,或雨於淵 ]
,甚是喜歡。
寫博客一方面是對自己學習的一點點總結及記錄,另一方面則是希望能夠幫助更多對大數據感興趣的朋友。如果你也對數據中臺、數據建模、數據分析以及 Flink/Spark/Hadoop/數倉開發
感興趣,可以關注我 https://blog.csdn.net/BeiisBei ,讓我們一起挖掘數據的價值~
每天都要進步一點點,生命不是要超越別人,而是要超越自己! (ง •_•)ง
文章目錄
一、Table API 和 Flink SQL 是什麼
- Flink 對批處理和流處理,提供了統一的上層API
- Table API 是一套內嵌在Java和Scala語言中的查詢API,它允許以非常直觀的方式組合來自一些關係運算符的查詢
- Flink的SQL支持基於實現了SQL標準的Apache Calcite
二、基本程序結構
Table API 和 SQL 的程序結構,與流式處理的程序結構十分類似
val tableEnv = ... // 創建表的執行環境
// 創建一張表,用於讀取數據
tableEnv.connect(...).createTemporaryTable("inputTable")
// 創建一張表,用於把計算結構輸出
tableEnv.connect(...).createTemporaryTable("outputTable")
// 通過 Table API 查詢算子,得到一張結果表
val result = tableEnv.from("inputTable").select(...)
// 通過 SQL 查詢語句,得到一張結果表
val sqlResult = tableEnv.sqlQuery("SELECT ... FROM inputTable ...")
// 將結果表寫入輸出表中
result.insertInto("outputTable")
三、創建 TableEnvironment
- 創建表的執行環境,需要將flink流處理的執行環境傳入
val tableEnv = StreamTableEnvironment.create(env)
-
TableEnvironment 是 flink 中集成Table API 和 SQL 的核心概念,所有對錶的操作都基於 TableEnvironment
- 註冊 Catalog
- 在 Catalog 中註冊表
- 執行 SQL 查詢
- 註冊用戶自定義函數(UDF)
不同處理環境的定義:
四、表(Table)
- TableEnvironment 可以註冊目錄 Catalog,並可以基於 Catalog 註冊表
- 表(Table)是由一個“標識符”(identifier)來指定的,由3部分組成:Catalog 名、數據庫(database)名和對象名
- 表可以是常規的,也可以是虛擬的(視圖,view)
- 常規表(Table)一般可以用來描述外部數據,比如文件、數據庫或消息隊列的數據,也可以直接從 DataStream 轉換而來
- 視圖(View)可以從現有的表中創建,通常是 table API 或者 SQL 查詢的一個結果集
五、讀取文件創建表
TableEnvironment 可以調用.connect()
方法,連接外部系統,並調用.createTemporaryTable()
方法,在 Catalog 中註冊表
tableEnv
.connect(...) // 定義表的數據來源,和外部系統建立連接
.withFormat(...) // 定義數據格式化方法
.withSchema(...) // 定義表結構
.createTemporaryTable("MyTable") // 創建臨時表
可以創建Table來描述文件數據,它可以從文件中讀取,或者將數據寫入文件
可以看到,我們從txt文件中讀出六條數據,並以三元組的形式進行輸出。
六、讀取Kafka數據創建表
消費Kafka數據
七、表的查詢 - Table API & SQL
- Table API 是集成在 Scala 和 Java 語言內的查詢API
- Table API 基於代表“表”的Table類,並提供一整套操作處理的方法API;這些方法會返回一個新的Table對象,表示對輸入表應用轉換操作的結果
- 有些關係型轉換操作,可以由多個方法調用組成,構成鏈式調用結構
val sensorTable:Table = tableEnv.form("inputTable")
val resultTable:Table = sensorTable
.select("id,temperature")
.filter("id = 'sensor_1'")
測試結果如下:
true / false —> 表示數據是否是新增 or 撤回回收 。
SQL 查詢示例:
八、將 DataStream 轉換成表
- 對於一個DataStream,可以直接轉換成Table,進而方便地調用 Table API 做轉換操作
val dataStream:DataStream[SensorReading] = ...
val sensorTable:Table = tableEnv.fromDataStream(dataStream)
- 默認轉換後的 Table schema 和 DataStream 中的字段定義一一對應,也可以單獨指定出來
val dataStream:DataStream[SensorReading] = ...
val sensorTable = tableEnv.fromDataStream(dataStream,
'id,'timestamp,'temperature)