摘要:每個在簡潔性和表達性之間提供不同的權衡,并針對不同的用例。在這些中處理的數據類型在相應的編程語言中表示為類。該是為中心的聲明性表,其可被動態地改變的表表示流時。這種抽象在語義和表達方面類似于,但是將程序表示為查詢表達式。
1 意義 1.1 分層的 APIs & 抽象層次
Flink提供三層API。 每個API在簡潔性和表達性之間提供不同的權衡,并針對不同的用例。
而且Flink提供不同級別的抽象來開發流/批處理應用程序
最低級抽象只提供有狀態流。它通過Process Function嵌入到DataStream API中。它允許用戶自由處理來自一個或多個流的事件,并使用一致的容錯狀態。此外,用戶可以注冊事件時間和處理時間回調,允許程序實現復雜的計算。
實際上,大多數應用程序不需要上述低級抽象,而是針對Core API編程, 如DataStream API(有界/無界流)和DataSet API (有界數據集)。這些流暢的API提供了用于數據處理的通用構建塊,例如各種形式的用戶指定的轉換,連接,聚合,窗口,狀態等。在這些API中處理的數據類型在相應的編程語言中表示為類。
低級Process Function與DataStream API集成,因此只能對某些 算子操作進行低級抽象。該數據集API提供的有限數據集的其他原語,如循環/迭代。
該 Table API 是為中心的聲明性DSL 表,其可被動態地改變的表(表示流時)。該 Table API遵循(擴展)關系模型:表有一個模式連接(類似于在關系數據庫中的表)和API提供可比的 算子操作,如選擇,項目,連接,分組依據,聚合等 Table API程序以聲明方式定義應該執行的邏輯 算子操作,而不是準確指定 算子操作代碼的外觀。雖然 Table API可以通過各種類型的用戶定義函數進行擴展,但它的表現力不如Core API,但使用更簡潔(編寫的代碼更少)。此外, Table API程序還會通過優化程序,在執行之前應用優化規則。
可以在表和DataStream / DataSet之間無縫轉換,允許程序混合 Table API以及DataStream 和DataSet API。
Flink提供的最高級抽象是SQL。這種抽象在語義和表達方面類似于 Table API,但是將程序表示為SQL查詢表達式。在SQL抽象與 Table API緊密地相互作用,和SQL查詢可以通過定義表來執行 Table API。1.2 模型類比MapReduce ==> Hive SQL
Spark ==> Spark SQL
Flink ==> SQL
Apache Flink具有兩個關系型API
Table API
SQL
用于統一流和批處理
Table API是Scala和Java語言集成查詢API,可以非常直觀的方式組合來自關系算子的查詢(e.g. 選擇,過濾和連接).
Flink的SQL支持基于實現SQL標準的Apache Calcite。無論輸入是批輸入(DataSet)還是流輸入(DataStream),任一接口中指定的查詢都具有相同的語義并指定相同的結果。
Table API和SQL接口彼此緊密集成,就如Flink的DataStream和DataSet API。我們可以輕松地在基于API構建的所有API和庫之間切換。例如,可以使用CEP庫從DataStream中提取模式,然后使用 Table API分析模式,或者可以在預處理上運行Gelly圖算法之前使用SQL查詢掃描,過濾和聚合批處理表數據。
Table API和SQL尚未完成并且正在積極開發中。并非 Table API,SQL和stream,batch輸入的每種組合都支持所有算子操作2.2 依賴結構
所有Table API和SQL組件都捆綁在flink-table Maven工件中。
以下依賴項與大多數項目相關:
flink-table-common
通過自定義函數,格式等擴展表生態系統的通用模塊。
flink-table-api-java
使用Java編程語言的純表程序的表和SQL API(在早期開發階段,不推薦!)。
flink-table-api-scala
使用Scala編程語言的純表程序的表和SQL API(在早期開發階段,不推薦!)。
flink-table-api-java-bridge
使用Java編程語言支持DataStream / DataSet API的Table&SQL API。
flink-table-api-scala-bridge
使用Scala編程語言支持DataStream / DataSet API的Table&SQL API。
flink-table-planner
表程序規劃器和運行時。
flink-table-uber
將上述模塊打包成大多數Table&SQL API用例的發行版。 uber JAR文件flink-table * .jar位于Flink版本的/ opt目錄中,如果需要可以移動到/ lib。
2.3 項目依賴必須將以下依賴項添加到項目中才能使用Table API和SQL來定義管道:
org.apache.flink flink-table-planner_2.11 1.8.0
此外,根據目標編程語言,您需要添加Java或Scala API。
org.apache.flink flink-table-api-java-bridge_2.11 1.8.0 org.apache.flink flink-table-api-scala-bridge_2.11 1.8.0
在內部,表生態系統的一部分是在Scala中實現的。 因此,請確保為批處理和流應用程序添加以下依賴項:
2.4 擴展依賴org.apache.flink flink-streaming-scala_2.11 1.8.0
如果要實現與Kafka或一組用戶定義函數交互的自定義格式,以下依賴關系就足夠了,可用于SQL客戶端的JAR文件:
org.apache.flink flink-table-common 1.8.0
目前,該模塊包括以下擴展點:
SerializationSchemaFactory
DeserializationSchemaFactory
ScalarFunction
TableFunction
AggregateFunction
3 概念和通用APITable API和SQL集成在一個聯合API中。此API的核心概念是Table用作查詢的輸入和輸出。本文檔顯示了具有 Table API和SQL查詢的程序的常見結構,如何注冊Table,如何查詢Table以及如何發出Table。
3.1 Table API和SQL程序的結構批處理和流式傳輸的所有 Table API和SQL程序都遵循相同的模式。以下代碼示例顯示了 Table API和SQL程序的常見結構。
// 對于批處理程序,使用ExecutionEnvironment而不是StreamExecutionEnvironment StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 創建一個TableEnvironment // 對于批處理程序使用BatchTableEnvironment而不是StreamTableEnvironment StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env); // 注冊一個 Table tableEnv.registerTable("table1", ...) // 或者 tableEnv.registerTableSource("table2", ...); // 或者 tableEnv.registerExternalCatalog("extCat", ...); // 注冊一個輸出 Table tableEnv.registerTableSink("outputTable", ...); / 從 Table API query 創建一個Table Table tapiResult = tableEnv.scan("table1").select(...); // 從 SQL query 創建一個Table Table sqlResult = tableEnv.sqlQuery("SELECT ... FROM table2 ... "); // 將表API結果表發送到TableSink,對于SQL結果也是如此 tapiResult.insertInto("outputTable"); // 執行 env.execute();3.2 將DataStream或DataSet轉換為表
它也可以直接轉換為a 而不是注冊a DataStream或DataSetin 。如果要在 Table API查詢中使用Table,這很方便。TableEnvironmentTable
// 獲取StreamTableEnvironment //在BatchTableEnvironment中注冊DataSet是等效的 StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env); DataStream> stream = ... // 將DataStream轉換為默認字段為“f0”,“f1”的表 Table table1 = tableEnv.fromDataStream(stream); // 將DataStream轉換為包含字段“myLong”,“myString”的表 Table table2 = tableEnv.fromDataStream(stream, "myLong, myString");
sale.csv文件
Scala
Java
還不完善,等日后Flink該模塊開發完畢再深入研究!
參考Table API & SQL
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75521.html
摘要:實際上,本身就預留了與外部元數據對接的能力,分別提供了和這兩個抽象。對接外部數據源搞清楚了注冊庫表的過程,給我們帶來這樣一個思路如果外部元數據創建的表也能被轉換成可識別的,那么就能被無縫地注冊到。 本文整理自 2019 年 4 月 13 日在深圳舉行的 Flink Meetup 會議,分享嘉賓張俊,目前擔任 OPPO 大數據平臺研發負責人,也是 Apache Flink contrib...
摘要:對批處理表的查詢不支持,和很多中常見的標量函數。此外,可以同時在靜態表和流表上進行查詢,這和的愿景是一樣的,將批處理看做特殊的流處理批看作是有限的流。最后,使用標準進行流處理意味著有很多成熟的工具支持。查詢結果直接顯示在中。 從何而來 關系型API有很多好處:是聲明式的,用戶只需要告訴需要什么,系統決定如何計算;用戶不必特地實現;更方便優化,可以執行得更高效。本身Flink就是一個統一...
摘要:擴展庫還包括用于復雜事件處理,機器學習,圖形處理和兼容性的專用代碼庫。事件時間機制使得那些事件無序到達甚至延遲到達的數據流能夠計算出精確的結果。負責接受用戶的程序代碼,然后創建數據流,將數據流提交給以便進一步執行。 showImg(https://segmentfault.com/img/remote/1460000016902812); 前言 Flink 是一種流式計算框架,為什么我...
閱讀 3947·2021-10-19 13:23
閱讀 2326·2021-09-09 11:37
閱讀 2507·2019-08-29 15:20
閱讀 3407·2019-08-29 11:08
閱讀 1661·2019-08-26 18:27
閱讀 1764·2019-08-23 12:20
閱讀 3028·2019-08-23 11:54
閱讀 2544·2019-08-22 15:19