【Flink】(十二)Flink Table API 和 Flink SQL 編程

寫在前面:我是「雲祁」,一枚熱愛技術、會寫詩的大數據開發猿。暱稱來源於王安石詩中一句 [ 雲之祁祁,或雨於淵 ] ,甚是喜歡。


寫博客一方面是對自己學習的一點點總結及記錄,另一方面則是希望能夠幫助更多對大數據感興趣的朋友。如果你也對 數據中臺、數據建模、數據分析以及 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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章