什么是Table API和Flink SQL
Flink本身是批流統一的處理框架,所以Table API和SQL,就是批流統一的上層處理API。目前功能尚未完善,處於活躍的開發階段。
Table API是一套內嵌在Java和Scala語言中的查詢API,它允許我們以非常直觀的方式,組合來自一些關系運算符的查詢(比如select、filter和join)。而對於Flink SQL,就是直接可以在代碼中寫SQL,來實現一些查詢(Query)操作。Flink的SQL支持,基於實現了SQL標准的Apache Calcite(Apache開源SQL解析工具)。
無論輸入是批輸入還是流式輸入,在這兩套API中,指定的查詢都具有相同的語義,得到相同的結果。
需要引入的依賴
取決於你使用的編程語言,比如這里,我們選擇 Scala API 來構建你的 Table API 和 SQL 程序:
<dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-api-scala-bridge_2.11</artifactId> <version>1.11.0</version> <scope>provided</scope> </dependency>
除此之外,如果你想在 IDE 本地運行你的程序,你需要添加下面的模塊,具體用哪個取決於你使用哪個 Planner,我們這里選擇使用 blink planner:
<dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-planner-blink_2.11</artifactId> <version>1.11.0</version> <scope>provided</scope> </dependency>
如果你想實現自定義格式來解析 Kafka 數據,或者自定義函數,使用下面的依賴:
<dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-common</artifactId> <version>1.11.0</version> <scope>provided</scope> </dependency>
- flink-table-planner-blink:planner計划器,是table API最主要的部分,提供了運行時環境和生成程序執行計划的planner;
- flink-table-api-scala-bridge:bridge橋接器,主要負責table API和 DataStream/DataSet API的連接支持,按照語言分java和scala。
這里的兩個依賴,是IDE環境下運行需要添加的;如果是生產環境,lib目錄下默認已經有了planner,就只需要有bridge就可以了。
需要注意的是:flink table本身有兩個 planner 計划器,在flink 1.11之后,已經默認使用 blink planner,如果想了解 old planner,可以查閱官方文檔。
兩種planner(old & blink)的區別
- 批流統一:Blink將批處理作業,視為流式處理的特殊情況。所以,blink不支持表和DataSet之間的轉換,批處理作業將不轉換為DataSet應用程序,而是跟流處理一樣,轉換為DataStream程序來處理。
- 因為批流統一,Blink planner也不支持BatchTableSource,而使用有界的StreamTableSource代替。
- Blink planner只支持全新的目錄,不支持已棄用的ExternalCatalog。
- 舊planner和Blink planner的FilterableTableSource實現不兼容。舊的planner會把PlannerExpressions下推到filterableTableSource中,而blink planner則會把Expressions下推。
- 基於字符串的鍵值配置選項僅適用於Blink planner。
- PlannerConfig在兩個planner中的實現不同。
- Blink planner會將多個sink優化在一個DAG中(僅在TableEnvironment上受支持,而在StreamTableEnvironment上不受支持)。而舊planner的優化總是將每一個sink放在一個新的DAG中,其中所有DAG彼此獨立。
- 舊的planner不支持目錄統計,而Blink planner支持。