日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

2021年大数据Flink(三十九):​​​​​​​Table与SQL ​​​​​​总结 Flink-SQL常用算子

發布時間:2023/11/28 生活经验 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2021年大数据Flink(三十九):​​​​​​​Table与SQL ​​​​​​总结 Flink-SQL常用算子 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

SELECT

WHERE

???????DISTINCT

???????GROUP BY

???????UNION?和?UNION ALL

???????JOIN

??????????????Group Window

???????Tumble Window

???????Hop Window

???????Session Window


總結 Flink-SQL常用算子

SELECT

SELECT 用于從 DataSet/DataStream 中選擇數據,用于篩選出某些列。

示例:

SELECT * FROM Table;// 取出表中的所有列

SELECT name,age FROM Table;// 取出表中 name 和 age 兩列

與此同時 SELECT 語句中可以使用函數和別名,例如我們上面提到的 WordCount 中:

SELECT word, COUNT(word) FROM table GROUP BY word;

?

???????WHERE

WHERE 用于從數據集/流中過濾數據,與 SELECT 一起使用,用于根據某些條件對關系做水平分割,即選擇符合條件的記錄。

?

示例:

SELECT name,age FROM Table where name LIKE ‘% 小明 %’;

SELECT * FROM Table WHERE age = 20;

WHERE 是從原數據中進行過濾,那么在 WHERE 條件中,Flink SQL 同樣支持 =、<、>、<>、>=、<=,以及 AND、OR 等表達式的組合,最終滿足過濾條件的數據會被選擇出來。并且 WHERE 可以結合 IN、NOT IN 聯合使用。舉個例子:

SELECT name, age

FROM Table

WHERE name IN (SELECT name FROM Table2)

?

???????DISTINCT

DISTINCT 用于從數據集/流中去重根據 SELECT 的結果進行去重。

?

示例:

SELECT DISTINCT name FROM Table;

對于流式查詢,計算查詢結果所需的 State 可能會無限增長,用戶需要自己控制查詢的狀態范圍,以防止狀態過大。

?

???????GROUP BY

GROUP BY 是對數據進行分組操作。例如我們需要計算成績明細表中,每個學生的總分。

?

示例:

SELECT name, SUM(score) as TotalScore FROM Table GROUP BY name;

?

???????UNION?和?UNION ALL

UNION 用于將兩個結果集合并起來,要求兩個結果集字段完全一致,包括字段類型、字段順序。

不同于 UNION ALL 的是,UNION 會對結果數據去重。

?

示例:

SELECT * FROM T1 UNION (ALL) SELECT * FROM T2;

?

???????JOIN

JOIN 用于把來自兩個表的數據聯合起來形成結果表,Flink 支持的 JOIN 類型包括:

?

JOIN - INNER JOIN

LEFT JOIN - LEFT OUTER JOIN

RIGHT JOIN - RIGHT OUTER JOIN

FULL JOIN - FULL OUTER JOIN

這里的 JOIN 的語義和我們在關系型數據庫中使用的 JOIN 語義一致。

?

示例:

JOIN(將訂單表數據和商品表進行關聯)

SELECT * FROM Orders INNER JOIN Product ON Orders.productId = Product.id

?

LEFT JOIN 與 JOIN 的區別是當右表沒有與左邊相 JOIN 的數據時候,右邊對應的字段補 NULL 輸出,RIGHT JOIN 相當于 LEFT JOIN 左右兩個表交互一下位置。FULL JOIN 相當于 RIGHT JOIN 和 LEFT JOIN 之后進行 UNION ALL 操作。

?

示例:

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

?

??????????????Group Window

根據窗口數據劃分的不同,目前 Apache Flink 有如下 3 種 Bounded Window:

Tumble,滾動窗口,窗口數據有固定的大小,窗口數據無疊加;

Hop,滑動窗口,窗口數據有固定大小,并且有固定的窗口重建頻率,窗口數據有疊加;

Session,會話窗口,窗口數據沒有固定的大小,根據窗口數據活躍程度劃分窗口,窗口數據無疊加。

?

???????Tumble Window

Tumble 滾動窗口有固定大小,窗口數據不重疊,具體語義如下:

?

Tumble 滾動窗口對應的語法如下:

SELECT

????[gk],

????[TUMBLE_START(timeCol, size)],

????[TUMBLE_END(timeCol, size)],

????agg1(col1),

????...

????aggn(colN)

FROM Tab1

GROUP BY [gk], TUMBLE(timeCol, size)

?

其中:

[gk] 決定了是否需要按照字段進行聚合;

TUMBLE_START 代表窗口開始時間;

TUMBLE_END 代表窗口結束時間;

timeCol 是流表中表示時間字段;

size 表示窗口的大小,如 秒、分鐘、小時、天。

?

舉個例子,假如我們要計算每個人每天的訂單量,按照 user 進行聚合分組:

SELECT user, TUMBLE_START(rowtime, INTERVAL ‘1’ DAY) as wStart, SUM(amount)

FROM Orders

GROUP BY TUMBLE(rowtime, INTERVAL ‘1’ DAY), user;

?

???????Hop Window

Hop 滑動窗口和滾動窗口類似,窗口有固定的 size,與滾動窗口不同的是滑動窗口可以通過 slide 參數控制滑動窗口的新建頻率。因此當 slide 值小于窗口 size 的值的時候多個滑動窗口會重疊,具體語義如下:

?

Hop 滑動窗口對應語法如下:

SELECT

????[gk],

????[HOP_START(timeCol, slide, size)] , ?

????[HOP_END(timeCol, slide, size)],

????agg1(col1),

????...

????aggN(colN)

FROM Tab1

GROUP BY [gk], HOP(timeCol, slide, size)

?

每次字段的意思和 Tumble 窗口類似:

[gk] 決定了是否需要按照字段進行聚合;

HOP_START 表示窗口開始時間;

HOP_END 表示窗口結束時間;

timeCol 表示流表中表示時間字段;

slide 表示每次窗口滑動的大小;

size 表示整個窗口的大小,如 秒、分鐘、小時、天。

?

舉例說明,我們要每過一小時計算一次過去 24 小時內每個商品的銷量:

SELECT product, SUM(amount)

FROM Orders

GROUP BY product,HOP(rowtime, INTERVAL '1' HOUR, INTERVAL '1' DAY)

?

???????Session Window

會話時間窗口沒有固定的持續時間,但它們的界限由 interval 不活動時間定義,即如果在定義的間隙期間沒有出現事件,則會話窗口關閉。

?

Seeeion 會話窗口對應語法如下:

SELECT

????[gk],

????SESSION_START(timeCol, gap) AS winStart, ?

????SESSION_END(timeCol, gap) AS winEnd,

????agg1(col1),

?????...

????aggn(colN)

FROM Tab1

GROUP BY [gk], SESSION(timeCol, gap)

[gk] 決定了是否需要按照字段進行聚合;

SESSION_START 表示窗口開始時間;

SESSION_END 表示窗口結束時間;

timeCol 表示流表中表示時間字段;

gap 表示窗口數據非活躍周期的時長。

?

例如,我們需要計算每個用戶訪問時間 12 小時內的訂單量:

SELECT user, SESSION_START(rowtime, INTERVAL ‘12’ HOUR) AS sStart, SESSION_ROWTIME(rowtime, INTERVAL ‘12’ HOUR) AS sEnd, SUM(amount)

FROM Orders

GROUP BY SESSION(rowtime, INTERVAL ‘12’ HOUR), user

總結

以上是生活随笔為你收集整理的2021年大数据Flink(三十九):​​​​​​​Table与SQL ​​​​​​总结 Flink-SQL常用算子的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。