flink快速入門(部署+flink-sql)
部署
flink-sql
下載聯結器-更多聯結器自己去官網查
!注意 把 上面截圖jar包放在flink-1.12.0/lib 目錄下如果有問題就把flink-1.12.0/bin/sql-client.sh 這個檔案複製一份放在lib 目錄下
啟動本地叢集
./bin/start-cluster.sh
啟動客戶端
./bin/sql-client.sh embedded
進入flink-sql 命令列
選擇展示樣式:
SET execution.result-mode=table;
SET execution.result-mode=changelog;
SET execution.result-mode=tableau;
Flink SQL> SET execution.result-mode=tableau;
[INFO] Session property has been set.
Flink SQL>
mysql 建立兩個表
flink 建立同樣的表:
簡單的插入任務
Flink SQL> select * from table_name;
+-----+-------------+-------------+-------------+
| +/- | aaa | bbb | ccc |
+-----+-------------+-------------+-------------+
| + | 111 | 222 | 333 |
| + | 222 | 333 | 444 |
| + | 333 | 444 | 555 |
| + | 666 | 777 | 888 |
| + | 999 | 100 | 101 |
| + | 100 | 101 | 102 |
| + | 101 | 102 | 103 |
+-----+-------------+-------------+-------------+
Received a total of 7 rows
Flink SQL> select * from table_name1;
+-----+-------------+-------------+-------------+
| +/- | aaa | bbb | ccc |
+-----+-------------+-------------+-------------+
Received a total of 0 rows
Flink SQL> insert into table_name1 select * from table_name where aaa = 111;
[INFO] Submitting SQL update statement to the cluster...
[INFO] Table update statement has been successfully submitted to the cluster:
Job ID: 43ddc128683d044e6ee757faafb19f5d
Flink SQL> select * from table_name1;
+-----+-------------+-------------+-------------+
| +/- | aaa | bbb | ccc |
+-----+-------------+-------------+-------------+
| + | 111 | 222 | 333 |
+-----+-------------+-------------+-------------+
Received a total of 1 rows
一些基礎語法使用:
Flink SQL> select aaa,bbb as bbc from table_name t where t.bbb % 2=0;
+-----+-------------+-------------+
| +/- | aaa | bbc |
+-----+-------------+-------------+
| + | 111 | 222 |
| + | 333 | 444 |
| + | 999 | 100 |
| + | 101 | 102 |
+-----+-------------+-------------+
Received a total of 4 rows
Flink SQL> select aaa,bbb from table_name group by aaa,bbb having bbb >=222;
+-----+-------------+-------------+
| +/- | aaa | bbb |
+-----+-------------+-------------+
| + | 111 | 222 |
| + | 222 | 333 |
| + | 333 | 444 |
| + | 666 | 777 |
+-----+-------------+-------------+
Received a total of 4 rows
--視窗分組
Flink SQL> select * from table_name;
+-----+-------------+-------------+-------------+-------------------------+
| +/- | aaa | bbb | ccc | time_str |
+-----+-------------+-------------+-------------+-------------------------+
| + | 111 | 222 | 333 | 2020-12-25T18:01 |
| + | 111 | 333 | 444 | 2020-12-25T18:02:01 |
| + | 111 | 444 | 555 | 2020-12-25T18:03:02 |
| + | 666 | 777 | 888 | 2020-12-25T18:04:03 |
| + | 111 | 100 | 101 | 2020-12-25T18:05:04 |
| + | 100 | 101 | 102 | 2020-12-25T18:06:05 |
| + | 111 | 102 | 103 | 2020-12-25T18:07:06 |
+-----+-------------+-------------+-------------+-------------------------+
Received a total of 7 rows
--第一行資料除外,按著時間,aaa分組,每兩分鐘分一組聚合計算
Flink SQL> SELECT aaa,sum(bbb) as bbc FROM table_name GROUP BY TUMBLE(time_str, INTERVAL '2' MINUTE),aaa;
+-----+-------------+-------------+
| +/- | aaa | bbc |
+-----+-------------+-------------+
| + | 111 | 222 |
| + | 111 | 777 |
| + | 666 | 777 |
| + | 111 | 100 |
| + | 100 | 101 |
| + | 111 | 102 |
+-----+-------------+-------------+
Received a total of 6 rows
--注意視窗操作的時候需要指定時間屬性
--注意資料來源與flink 資料型別 DATETIME(mysql)-->TIMESTAMP(flink)
CREATE TABLE table_name (
aaa INT,
bbb INT,
ccc INT,
time_str TIMESTAMP(3),
WATERMARK FOR time_str AS time_str
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:mysql://localhost:3306/test',
'table-name' = 'table_name',
'username' = 'root',
'password' = 'Wang32?_#@%'
)
--WATERMARK 定義了表的事件時間屬性
WATERMARK 定義了表的事件時間屬性,其形式為 WATERMARK FOR rowtime_column_name AS watermark_strategy_expression 。
Flink 提供了幾種常用的 watermark 策略。
watermark_strategy_expression 定義了 watermark 的生成策略。它允許使用包括計算列在內的任意非查詢表示式來計算 watermark ;表示式的返回型別必須是 TIMESTAMP(3),表示了從 Epoch 以來的經過的時間
嚴格遞增時間戳: WATERMARK FOR rowtime_column AS rowtime_column。
發出到目前為止已觀察到的最大時間戳的 watermark ,時間戳大於最大時間戳的行被認為沒有遲到。
遞增時間戳: WATERMARK FOR rowtime_column AS rowtime_column - INTERVAL '0.001' SECOND。
發出到目前為止已觀察到的最大時間戳減 1 的 watermark ,時間戳大於或等於最大時間戳的行被認為沒有遲到。
有界亂序時間戳: WATERMARK FOR rowtime_column AS rowtime_column - INTERVAL 'string' timeUnit。
--很多和標準SQL 差不多這裡就不 一一敲了 以下語法都是從官方文件複製的。
SELECT * FROM Orders
SELECT a, c AS d FROM Orders
SELECT * FROM Orders WHERE b = 'red'
SELECT * FROM Orders WHERE a % 2 = 0
/*--PRETTY_PRINT 使用者自定義函式
--自定義函式必須事先註冊到 TableEnvironment 中。
--可閱讀 自定義函式文件 以獲得如何指定和註冊自定義函式的詳細資訊。*/
SELECT PRETTY_PRINT(user) FROM Orders
--分組聚合 group
SELECT a, SUM(b) as d
FROM Orders
GROUP BY a
--視窗聚合TUMBLE 滾動視窗
SELECT user, SUM(amount)
FROM Orders
GROUP BY TUMBLE(rowtime, INTERVAL '1' DAY), user
--Over Window aggregation
--ORDER BY 必須指定於單個的時間屬性。
--ROWS BETWEEN 2 PRECEDING AND CURRENT ROW 指定範圍 前兩行到當前行
SELECT COUNT(amount) OVER (
PARTITION BY user
ORDER BY proctime
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
FROM Orders
--視窗
SELECT COUNT(amount) OVER w, SUM(amount) OVER w
FROM Orders
WINDOW w AS (
PARTITION BY user
ORDER BY proctime
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
SELECT DISTINCT users FROM Orders
--流式 Grouping sets、Rollup 以及 Cube 只在 Blink planner 中支援。
SELECT SUM(amount)
FROM Orders
GROUP BY GROUPING SETS ((user), (product))
--having
SELECT SUM(amount)
FROM Orders
GROUP BY users
HAVING SUM(amount) > 50
--使用者自定義UDF
SELECT MyAggregate(amount)
FROM Orders
GROUP BY users
--等值連結 目前只支撐等值
/*注意事項
目前僅支援 equi-join ,即 join 的聯合條件至少擁有一個相等謂詞。
不支援任何 cross join 和 theta join。
注意: Join 的順序沒有進行優化,join 會按照 FROM 中所定義的順序依次執行。
請確保 join 所指定的表在順序執行中不會產生不支援的 cross join (笛卡兒積)以至查詢失敗。
*/
SELECT *
FROM Orders INNER JOIN Product ON Orders.productId = Product.id
--左連結,右連結,全連結Outer Equi-join
SELECT *
FROM Orders LEFT JOIN Product ON Orders.productId = Product.id
SELECT *
FROM Orders RIGHT JOIN Product ON Orders.productId = Product.id
SELECT *
FROM Orders FULL OUTER JOIN Product ON Orders.productId = Product.id
--Interval join (時間區間關聯)必須要有一個時間作為關聯條件
SELECT *
FROM Orders o, Shipments s
WHERE o.id = s.orderId AND
o.ordertime BETWEEN s.shiptime - INTERVAL '4' HOUR AND s.shiptime
--Expanding arrays into a relation 將陣列展開為一個關係
SELECT users, tag
FROM Orders CROSS JOIN UNNEST(tags) AS t (tag)
--Join 表函式 (UDTF)
/*
Inner Join
將表與表函式的結果進行 join 操作。
左表(outer)中的每一行將會與呼叫表函式所產生的所有結果中相關聯行進行 join 。
*/
SELECT users, tag
FROM Orders, LATERAL TABLE(unnest_udtf(tags)) AS t(tag)
--當前僅支援文字常量 TRUE 作為針對橫向表的左外部聯接的謂詞。
SELECT users, tag
FROM Orders LEFT JOIN LATERAL TABLE(unnest_udtf(tags)) AS t(tag) ON TRUE
---Temporal Tables 是跟隨時間變化而變化的表。
SELECT
o_amount, r_rate
FROM
Orders,
LATERAL TABLE (Rates(o_proctime))
WHERE
r_currency = o_currency
--Join Temporal Tables
/*
Temporal Tables 是隨時間變化而變化的表。 Temporal Table 提供訪問指定時間點的 temporal table 版本的功能。
僅支援帶有處理時間的 temporal tables 的 inner 和 left join。
下述示例中,假設 LatestRates 是一個根據最新的 rates 物化的 Temporal Table 。
*/
--僅 Blink planner 支援。
SELECT
o.amout, o.currency, r.rate, o.amount * r.rate
FROM
Orders AS o
JOIN LatestRates FOR SYSTEM_TIME AS OF o.proctime AS r
ON r.currency = o.currency
--集合操作--集合操作--集合操作
--Union
SELECT *
FROM (
(SELECT user FROM Orders WHERE a % 2 = 0)
UNION
(SELECT user FROM Orders WHERE b = 0)
)
--UnionAll
SELECT *
FROM (
(SELECT user FROM Orders WHERE a % 2 = 0)
UNION ALL
(SELECT user FROM Orders WHERE b = 0)
)
--Intersect 交集 / Except 除了
SELECT *
FROM (
(SELECT user FROM Orders WHERE a % 2 = 0)
INTERSECT
(SELECT user FROM Orders WHERE b = 0)
)
SELECT *
FROM (
(SELECT user FROM Orders WHERE a % 2 = 0)
EXCEPT
(SELECT user FROM Orders WHERE b = 0)
)
--in
/*
在流查詢中,這一操作將會被重寫為 join 和 group 操作。
該查詢所需要的狀態可能會由於不同的輸入行數而導致無限增長。
請在查詢配置中提合理的保留間隔以避免產生狀態過大。
*/
SELECT user, amount
FROM Orders
WHERE product IN (
SELECT product FROM NewProducts
)
--Exists
SELECT user, amount
FROM Orders
WHERE product EXISTS (
SELECT product FROM NewProducts
)
--OrderBy & Limit
SELECT *
FROM Orders
ORDER BY orderTime
SELECT *
FROM Orders
ORDER BY orderTime
LIMIT 3
--TOP-N
/*
Top-N 的唯一鍵是分割槽列和 rownum 列的結合,另外 Top-N 查詢也可以獲得上游的唯一鍵。
以下面的任務為例,product_id 是 ShopSales 的唯一鍵,然後 Top-N 的唯一鍵是 [category, rownum] 和 [product_id]
*/
SELECT [column_list]
FROM (
SELECT [column_list],
ROW_NUMBER() OVER ([PARTITION BY col1[, col2...]]
ORDER BY col1 [asc|desc][, col2 [asc|desc]...]) AS rownum
FROM table_name)
WHERE rownum <= N [AND conditions]
--去重
SELECT [column_list]
FROM (
SELECT [column_list],
ROW_NUMBER() OVER ([PARTITION BY col1[, col2...]]
ORDER BY time_attr [asc|desc]) AS rownum
FROM table_name)
WHERE rownum = 1
--一些輔助函式---注意: 輔助函式必須使用與 GROUP BY 子句中的分組視窗函式完全相同的引數來呼叫.
Table result1 = tableEnv.sqlQuery(
"SELECT user, " +
" TUMBLE_START(rowtime, INTERVAL '1' DAY) as wStart, " +
" SUM(amount) FROM Orders " +
"GROUP BY TUMBLE(rowtime, INTERVAL '1' DAY), user")
--返回相對應的滾動、滑動和會話視窗範圍內的下界時間戳。
TUMBLE_START(time_attr, interval)
HOP_START(time_attr, interval, interval)
SESSION_START(time_attr, interval)
/*
返回相對應的滾動、滑動和會話視窗範圍以外的上界時間戳。
注意: 範圍以外的上界時間戳不可以 在隨後基於時間的操作中,作為 行時間屬性 使用,比如 interval join 以及 分組視窗或分組視窗上的聚合。
*/
TUMBLE_END(time_attr, interval)
HOP_END(time_attr, interval, interval)
SESSION_END(time_attr, interval)
/*
返回相對應的滾動、滑動和會話視窗範圍以內的上界時間戳。
返回的是一個可用於後續需要基於時間的操作的時間屬性(rowtime attribute),比如interval join 以及 分組視窗或分組視窗上的聚合。
*/
TUMBLE_ROWTIME(time_attr, interval)
HOP_ROWTIME(time_attr, interval, interval)
SESSION_ROWTIME(time_attr, interval)
/*
返回一個可用於後續需要基於時間的操作的 處理時間引數,比如interval join 以及 分組視窗或分組視窗上的聚合.
*/
TUMBLE_PROCTIME(time_attr, interval)
HOP_PROCTIME(time_attr, interval, interval)
SESSION_PROCTIME(time_attr, interval)
--模式匹配
/*
根據 MATCH_RECOGNIZE ISO 標準在流處理表中搜尋給定的模式。 這樣就可以在SQL查詢中描述複雜的事件處理(CEP)邏輯。
更多詳情請參考 檢測表中的模式.
*/
SELECT T.aid, T.bid, T.cid
FROM MyTable
MATCH_RECOGNIZE (
PARTITION BY userid
ORDER BY proctime
MEASURES
A.id AS aid,
B.id AS bid,
C.id AS cid
PATTERN (A B C)
DEFINE
A AS name = 'a',
B AS name = 'b',
C AS name = 'c'
) AS T
--case when 儘量用 FILTER 替換
SELECT
day,
COUNT(DISTINCT user_id) AS total_uv,
COUNT(DISTINCT CASE WHEN flag IN ('android', 'iphone') THEN user_id ELSE NULL END) AS app_uv,
COUNT(DISTINCT CASE WHEN flag IN ('wap', 'other') THEN user_id ELSE NULL END) AS web_uv
FROM T
GROUP BY day
--
SELECT
day,
COUNT(DISTINCT user_id) AS total_uv,
COUNT(DISTINCT user_id) FILTER (WHERE flag IN ('android', 'iphone')) AS app_uv,
COUNT(DISTINCT user_id) FILTER (WHERE flag IN ('wap', 'other')) AS web_uv
FROM T
GROUP BY day
-----------------creat table -------------------creat table -------------------creat table -------------------creat table -------------------creat table -------------------creat table -------------------creat table --
--建立表
CREATE TABLE [catalog_name.][db_name.]table_name
(
{ <column_definition> | <computed_column_definition> }[ , ...n]
[ <watermark_definition> ]
[ <table_constraint> ][ , ...n]
)
[COMMENT table_comment]
[PARTITIONED BY (partition_column_name1, partition_column_name2, ...)]
WITH (key1=val1, key2=val2, ...)
[ LIKE source_table [( <like_options> )] ]
/*
<column_definition>:
column_name column_type [ <column_constraint> ] [COMMENT column_comment]
<column_constraint>:
[CONSTRAINT constraint_name] PRIMARY KEY NOT ENFORCED
<table_constraint>:
[CONSTRAINT constraint_name] PRIMARY KEY (column_name, ...) NOT ENFORCED
<computed_column_definition>:
column_name AS computed_column_expression [COMMENT column_comment]
<watermark_definition>:
WATERMARK FOR rowtime_column_name AS watermark_strategy_expression
<source_table>:
[catalog_name.][db_name.]table_name
<like_options>:
{
{ INCLUDING | EXCLUDING } { ALL | CONSTRAINTS | PARTITIONS }
| { INCLUDING | EXCLUDING | OVERWRITING } { GENERATED | OPTIONS | WATERMARKS }
}[, ...]
*/
/*
注意事項:列裡面計算不能有子查詢,達式可以包含物理列、常量、函式或變數的任意組合
定義在一個資料來源表( source table )上的計算列會在從資料來源讀取資料後被計算,它們可以在 SELECT 查詢語句中使用。
計算列不可以作為 INSERT 語句的目標,在 INSERT 語句中,SELECT 語句的 schema 需要與目標表不帶有計算列的 schema 一致。
*/
-----一些實列--------一些實列--------一些實列--------一些實列--------一些實列---
CREATE TABLE Orders (
user BIGINT,
product STRING,
order_time TIMESTAMP(3),
WATERMARK FOR order_time AS order_time - INTERVAL '5' SECOND
) WITH ( . . . );
--主鍵 PRIMARY KEY flink 不作儲存資料,他不會檢查是否唯一,需要使用者自己保證
--分割槽 PARTITIONED BY 根據指定的列對已經建立的表進行分割槽。若表使用 filesystem sink ,則將會為每個分割槽建立一個目錄。
--WATERMARK 定義了表的事件時間屬性,其形式為 WATERMARK FOR rowtime_column_name AS watermark_strategy_expression
/*
WITH OPTIONS
表屬性用於建立 table source/sink ,一般用於尋找和建立底層的聯結器。
*/
--LIKE 子句可以基於現有表的定義去建立新表,並且可以擴充套件或排除原始表中的某些部分
CREATE TABLE Orders (
user BIGINT,
product STRING,
order_time TIMESTAMP(3)
) WITH (
'connector' = 'kafka',
'scan.startup.mode' = 'earliest-offset'
);
--這裡用like 建立了一個新表並增加了一些屬性
CREATE TABLE Orders_with_watermark (
-- 新增 watermark 定義
WATERMARK FOR order_time AS order_time - INTERVAL '5' SECOND
) WITH (
-- 改寫 startup-mode 屬性
'scan.startup.mode' = 'latest-offset'
)
LIKE Orders;
--等效語句
CREATE TABLE Orders_with_watermark (
user BIGINT,
product STRING,
order_time TIMESTAMP(3),
WATERMARK FOR order_time AS order_time - INTERVAL '5' SECOND
) WITH (
'connector' = 'kafka',
'scan.startup.mode' = 'latest-offset'
);
/*
表屬性的合併邏輯可以用 like options 來控制。
可以控制合併的表屬性如下:
CONSTRAINTS - 主鍵和唯一鍵約束
GENERATED - 計算列
OPTIONS - 聯結器資訊、格式化方式等配置項
PARTITIONS - 表分割槽資訊
WATERMARKS - watermark 定義
並且有三種不同的表屬性合併策略:
INCLUDING - 新表包含源表(source table)所有的表屬性,如果和源表的表屬性重複則會直接失敗,例如新表和源表存在相同 key 的屬性。
EXCLUDING - 新表不包含源表指定的任何表屬性。
OVERWRITING - 新表包含源表的表屬性,但如果出現重複項,則會用新表的表屬性覆蓋源表中的重複表屬性,例如,兩個表中都存在相同 key 的屬性,則會使用當前語句中定義的 key 的屬性值。
*/
--instance
-- 儲存在檔案系統的源表
CREATE TABLE Orders_in_file (
user BIGINT,
product STRING,
order_time_string STRING,
order_time AS to_timestamp(order_time)
)
PARTITIONED BY user
WITH (
'connector' = 'filesystem'
'path' = '...'
);
-- 對應儲存在 kafka 的源表
CREATE TABLE Orders_in_kafka (
-- 新增 watermark 定義
WATERMARK FOR order_time AS order_time - INTERVAL '5' SECOND
) WITH (
'connector': 'kafka'
...
)
LIKE Orders_in_file (
-- 排除需要生成 watermark 的計算列之外的所有內容。
-- 去除不適用於 kafka 的所有分割槽和檔案系統的相關屬性。
EXCLUDING ALL
INCLUDING GENERATED
);
---建立目錄--
CREATE CATALOG catalog_name
WITH (key1=val1, key2=val2, ...)
---建立資料庫
CREATE DATABASE [IF NOT EXISTS] [catalog_name.]db_name
[COMMENT database_comment]
WITH (key1=val1, key2=val2, ...)
/*
IF NOT EXISTS
若資料庫已經存在,則不會進行任何操作。
WITH OPTIONS
資料庫屬性一般用於儲存關於這個資料庫額外的資訊。 表示式 key1=val1 中的鍵和值都需要是字串文字常量。
*/
---建立檢視
CREATE [TEMPORARY] VIEW [IF NOT EXISTS] [catalog_name.][db_name.]view_name
[{columnName [, columnName ]* }] [COMMENT view_comment]
AS query_expression
/*
TEMPORARY
建立一個有 catalog 和資料庫名稱空間的臨時檢視,並覆蓋原有的檢視。
IF NOT EXISTS
若該檢視已經存在,則不會進行任何操作。
*/
---建立一個函式
CREATE [TEMPORARY|TEMPORARY SYSTEM] FUNCTION
[IF NOT EXISTS] [[catalog_name.]db_name.]function_name
AS identifier [LANGUAGE JAVA|SCALA|PYTHON]
/*
如果 language tag 是 JAVA 或者 SCALA ,則 identifier 是 UDF 實現類的全限定名。關於 JAVA/SCALA UDF 的實現,請參考 自定義函式。
如果 language tag 是 PYTHON ,則 identifier 是 UDF 物件的全限定名,例如 pyflink.table.tests.test_udf.add。關於 PYTHON UDF 的實現,請參考 Python UDFs。
TEMPORARY
建立一個有 catalog 和資料庫名稱空間的臨時 catalog function ,並覆蓋原有的 catalog function 。
TEMPORARY SYSTEM
建立一個沒有資料庫名稱空間的臨時系統 catalog function ,並覆蓋系統內建的函式。
IF NOT EXISTS
若該函式已經存在,則不會進行任何操作。
LANGUAGE JAVA|SCALA|PYTHON
Language tag 用於指定 Flink runtime 如何執行這個函式。目前,只支援 JAVA, SCALA 和 PYTHON,且函式的預設語言為 JAVA。
*/
---------drop------------drop------------drop------------drop------------drop------------drop------------drop--------
--刪除表
DROP TABLE [IF EXISTS] [catalog_name.][db_name.]table_name
--刪除資料庫:
/*
RESTRICT
當刪除一個非空資料庫時,會觸發異常。(預設為開)
CASCADE
刪除一個非空資料庫時,把相關聯的表與函式一併刪除。
*/
DROP DATABASE [IF EXISTS] [catalog_name.]db_name [ (RESTRICT | CASCADE) ]
--刪除檢視
DROP [TEMPORARY] VIEW [IF EXISTS] [catalog_name.][db_name.]view_name
--刪除函式
/*
TEMPORARY
刪除一個有 catalog 和資料庫名稱空間的臨時 catalog function。
TEMPORARY SYSTEM
刪除一個沒有資料庫名稱空間的臨時系統函式。
*/
DROP [TEMPORARY|TEMPORARY SYSTEM] FUNCTION [IF EXISTS] [catalog_name.][db_name.]function_name;
-----ALTER-----ALTER-----ALTER-----ALTER-----ALTER-----ALTER-----ALTER-----ALTER-----ALTER-----ALTER-----ALTER-----ALTER-----ALTER-----ALTER
---重新命名錶
ALTER TABLE [catalog_name.][db_name.]table_name RENAME TO new_table_name
--修改表的屬性
ALTER TABLE [catalog_name.][db_name.]table_name SET (key1=val1, key2=val2, ...)
---修改資料庫屬性
ALTER DATABASE [catalog_name.]db_name SET (key1=val1, key2=val2, ...)
---修改函式
/*
TEMPORARY
修改一個有 catalog 和資料庫名稱空間的臨時 catalog function ,並覆蓋原有的 catalog function 。
TEMPORARY SYSTEM
修改一個沒有資料庫名稱空間的臨時系統 catalog function ,並覆蓋系統內建的函式。
IF EXISTS
若函式不存在,則不進行任何操作。
LANGUAGE JAVA|SCALA|PYTHON
Language tag 用於指定 Flink runtime 如何執行這個函式。目前,只支援 JAVA,SCALA 和 PYTHON,且函式的預設語言為 JAVA。
*/
ALTER [TEMPORARY|TEMPORARY SYSTEM] FUNCTION
[IF EXISTS] [catalog_name.][db_name.]function_name
AS identifier [LANGUAGE JAVA|SCALA|PYTHON]
----INSERT----INSERT----INSERT----INSERT----INSERT----INSERT----INSERT----INSERT----INSERT----INSERT----INSERT----INSERT----INSERT----INSERT
--語法
/*
OVERWRITE
INSERT OVERWRITE 將會覆蓋表中或分割槽中的任何已存在的資料。否則,新資料會追加到表中或分割槽中。--這個需要實現底層的一個方法
INSERT OVERWRITE requires that the underlying DynamicTableSink of table 'default_catalog.default_database.table_name1' implements the SupportsOverwrite interface.
PARTITION
PARTITION 語句應該包含需要插入的靜態分割槽列與值。
*/
INSERT { INTO | OVERWRITE } [catalog_name.][db_name.]table_name [PARTITION part_spec] select_statement
part_spec:
(part_col_name1=val1 [, part_col_name2=val2, ...])
--例項
-- 建立一個分割槽表
CREATE TABLE country_page_view (user STRING, cnt INT, date STRING, country STRING)
PARTITIONED BY (date, country)
WITH (...)
-- 追加行到該靜態分割槽中 (date='2019-8-30', country='China')
INSERT INTO country_page_view PARTITION (date='2019-8-30', country='China')
SELECT user, cnt FROM page_view_source;
-- 追加行到分割槽 (date, country) 中,其中 date 是靜態分割槽 '2019-8-30';country 是動態分割槽,其值由每一行動態決定
INSERT INTO country_page_view PARTITION (date='2019-8-30')
SELECT user, cnt, country FROM page_view_source;
-- 覆蓋行到靜態分割槽 (date='2019-8-30', country='China')
INSERT OVERWRITE country_page_view PARTITION (date='2019-8-30', country='China')
SELECT user, cnt FROM page_view_source;
-- 覆蓋行到分割槽 (date, country) 中,其中 date 是靜態分割槽 '2019-8-30';country 是動態分割槽,其值由每一行動態決定
INSERT OVERWRITE country_page_view PARTITION (date='2019-8-30')
SELECT user, cnt, country FROM page_view_source;
--直接插入值
INSERT { INTO | OVERWRITE } [catalog_name.][db_name.]table_name VALUES values_row [, values_row ...]
values_row:
: (val1 [, val2, ...])
--例項
CREATE TABLE students (name STRING, age INT, gpa DECIMAL(3, 2)) WITH (...);
INSERT INTO students
VALUES ('fred flintstone', 35, 1.28), ('barney rubble', 32, 2.32);
--------------------SQL Hints--------------------SQL Hints--------------------SQL Hints--------------------SQL Hints--------------------SQL Hints--------------------SQL Hints
/*
禁止使用預設的動態表選項,因為它可能會更改查詢的語義。
您需要將config選項table.dynamic-table-options.enabled設定為true顯式(預設為false)。
有關如何設定config選項的詳細資訊
-PY
# instantiate table environment
t_env = ...
# access flink configuration
configuration = t_env.get_config().get_configuration();
# set low-level key-value options
configuration.set_string("table.exec.mini-batch.enabled", "true");
configuration.set_string("table.exec.mini-batch.allow-latency", "5 s");
configuration.set_string("table.exec.mini-batch.size", "5000");
具體選項見官方文件
*/
--語法
table_path /*+ OPTIONS(key=val [, key=val]*) */
key:
stringLiteral
val:
stringLiteral
--例項:具體有那些選項看,官方Table API & SQL 配置
CREATE TABLE kafka_table1 (id BIGINT, name STRING, age INT) WITH (...);
CREATE TABLE kafka_table2 (id BIGINT, name STRING, age INT) WITH (...);
-- override table options in query source
select id, name from kafka_table1 /*+ OPTIONS('scan.startup.mode'='earliest-offset') */;
-- override table options in join
select * from
kafka_table1 /*+ OPTIONS('scan.startup.mode'='earliest-offset') */ t1
join
kafka_table2 /*+ OPTIONS('scan.startup.mode'='earliest-offset') */ t2
on t1.id = t2.id;
-- override table options for INSERT target table
insert into kafka_table1 /*+ OPTIONS('sink.partitioner'='round-robin') */ select * from kafka_table2;
----檢視錶欄位
DESCRIBE [catalog_name.][db_name.]table_name
---檢視執行計劃
EXPLAIN PLAN FOR <query_statement_or_insert_statement>
---切換目錄 資料庫
USE CATALOG catalog_name
USE [catalog_name.]database_name
---show ---show ---show ---show ---show ---show ---show ---show ---show
Flink SQL> SHOW CATALOGS
SHOW CURRENT CATALOG
SHOW DATABASES
SHOW CURRENT DATABASE
SHOW TABLES
SHOW VIEWS
SHOW FUNCTIONS
--beta版本
Flink SQL> SHOW MODULES;
----------------函式的一些概念----------------函式的一些概念----------------函式的一些概念----------------函式的一些概念----------------函式的一些概念
/*Flink 中的函式有兩個劃分標準
一個劃分標準是:系統(內建)函式和 Catalog 函式。
系統函式沒有名稱空間,只能通過其名稱來進行引用。
Catalog 函式屬於 Catalog 和資料庫,因此它們擁有 Catalog 和資料庫名稱空間。
使用者可以通過全/部分限定名(catalog.db.func 或 db.func)或者函式名 來對 Catalog 函式進行引用。
另一個劃分標準是:臨時函式和持久化函式。
臨時函式始終由使用者建立,它容易改變並且僅在會話的生命週期內有效。
持久化函式不是由系統提供,就是儲存在 Catalog 中,它在會話的整個生命週期內都有效。
Flink 4 種函式
臨時性系統函式
系統函式
臨時性 Catalog 函式
Catalog 函式
--臨時優先有持久化
--系統優先 Catalog
--具體用到什麼函式請查官方文件:https://ci.apache.org/projects/flink/flink-docs-release-1.12/zh/dev/table/functions/systemFunctions.html
*/
--精確函式引用:精確函式引用允許使用者跨 Catalog,跨資料庫呼叫 Catalog 函式
/*
解析順序如下:
臨時性 catalog 函式
Catalog 函式
模糊函式引用
*/
select mycatalog.mydb.myfunc(x) from mytable
select mydb.myfunc(x) from mytable
--模糊函式引用:在模糊函式引用中,使用者只需在 SQL 查詢中指定函式名
/*
解析順序如下:
臨時性系統函式
系統函式
臨時性 Catalog 函式, 在會話的當前 Catalog 和當前資料庫中
Catalog 函式, 在會話的當前 Catalog 和當前資料庫中
*/
select myfunc(x) from mytable
-----SQL客戶端配置--------SQL客戶端配置--------SQL客戶端配置--------SQL客戶端配置--------SQL客戶端配置--------SQL客戶端配置--------SQL客戶端配置--------SQL客戶端配置---
--啟動客戶端 embedded 嵌入式
--SQL 客戶端將從 ./conf/sql-client-defaults.yaml 中讀取配置
./bin/sql-client.sh embedded
--檢查啟動是否正確
SELECT 'Hello World';
--客戶端命令列展示模式選擇: 3種ingmoshi,一般選擇tableau
SET execution.result-mode=table;
SET execution.result-mode=changelog;
SET execution.result-mode=tableau;
------------一些中介軟體概念------------------一些中介軟體概念------------------一些中介軟體概念------------------一些中介軟體概念------------------一些中介軟體概念------
Debezium 是一個 CDC(Changelog Data Capture,變更資料捕獲)的工具,
可以把來自 MySQL、PostgreSQL、Oracle、Microsoft SQL Server 和許多其他資料庫的更改實時流式傳輸到 Kafka 中。
Debezium 為變更日誌提供了統一的格式結構,並支援使用 JSON 和 Apache Avro 序列化訊息。
Canal是一個CDC(ChangeLog資料捕獲,變更日誌資料捕獲)工具,
可以實時地將MySQL變更傳輸到其他系統。Canal為變更日誌提供了統一的資料格式,
並支援使用JSON或protobuf序列化訊息(Canal預設使用protobuf)。
Maxwell是CDC(Changelog資料捕獲)工具,
可以將MySQL中的更改實時流式傳輸到Kafka,
Kinesis和其他流式聯結器中。
Maxwell為變更日誌提供了統一的格式架構,並支援使用JSON序列化訊息。
希望能幫到想學習flink的小夥伴。
相關文章
- Cris 帶你快速入門 Flink
- 實時計算Flink——快速入門概述
- Flink 入門
- docker-compose快速部署flink1.18.1Docker
- KunlunDB 快速入門2.0(對等部署最佳實踐)
- 入門Flink,很簡單
- 快速排序快速入門排序
- 快速入門Flink(5)——Flink中的17種TransFormAction運算元(面試必問,建議收藏)ORMMac面試
- Flink DataStream 程式設計入門AST程式設計
- Dubbo 入門系列之快速部署一個微服務應用微服務
- SQL快速入門 ( MySQL快速入門, MySQL參考, MySQL快速回顧 )MySql
- 【Flink入門修煉】2-2 Flink State 狀態
- JavaScript快速入門JavaScript
- vim快速入門
- Webpack快速入門Web
- Lumen快速入門
- TypeScript 快速入門TypeScript
- phpunit 快速入門PHP
- React快速入門React
- WebSocket 快速入門Web
- Pipenv 快速入門
- MQTT 快速入門MQQT
- Zookeeper快速入門
- DvaJS快速入門JS
- SnakeYaml快速入門YAML
- RabbitMQ快速入門MQ
- 快速入門reactReact
- pipenv快速入門
- Promise快速入門Promise
- PHP快速入門PHP
- GitHub 快速入門Github
- mongodb快速入門MongoDB
- mysqlsla快速入門MySql
- Express快速入門Express
- Python快速入門Python
- NuxtJS快速入門UXJS
- MySQL 快速入門MySql
- jackson快速入門