flink快速入門(部署+flink-sql)

qq_35758926發表於2020-12-26

部署

在這裡插入圖片描述

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的小夥伴。

相關文章