流計算sql通常是乙個類sql的宣告式語言,主要用於對流式資料(streams)的持續性查詢,目的是在常見流計算平台和框架(如storm、spark streaming、flink、beam等)的底層api上,
通過使用簡易通用的的sql語言構建sql抽象層,降低實時開發的門檻。
流計算sql的原理其實很簡單,就是在sql和底層的流計算引擎之間架起一座橋梁---流計算sql被使用者提交,被sql引擎層翻譯為底層的api並在底層的流計算引擎上執行。比如對storm
來說,會自動翻譯成storm的任務拓撲並在storm集群上執行。
流計算sql引擎是流計算sql的核心,主要負責對使用者sql輸入進行語法分析、語義分析、邏輯計畫生成、邏輯計畫執行、物理執行計畫生成等操作。而真正執行計算的是底層的流計算平台。
不同於離線任務,實時的資料是不斷流入的,所以為了使用sql來對流處理進行抽象,流計算sql也引入了「表」的概念,不過這裡的表是動態表。
流計算sql的架構如下:
sql層:流計算sql給使用者的介面,它提供過濾、轉換、關聯、聚合、視窗、select、union、split等各種功能。
sql引擎層:負責sql解析/校驗、邏輯計畫生成優化和物理計畫執行等。
流計算引擎層:具體執行sql引擎層生成的執行計畫。
目前流計算sql在各個計算框架的進度和支援力度不一。
storm sql還只是乙個實驗性的功能。flink sql是flink大力推廣的核心api。flink是乙個原生的開源流計算引擎,而且目前還沒有其它開源流計算引擎能提供比flink 更優秀的流
計算sql框架和語法等,所以flink sql實際上在定義流計算sql的標註。
阿里雲stream sql 的底層就是flink引擎(實際是blink,也就是alibaba flink),可以認為blink是flink的企業版本,
阿里雲提供了stream sql 開發的完整環境,包括stream sql語法、ide開發工具、除錯及運維等。下面具體介紹概念和語法
3.1、stream sql 源表
stream sql 通常將源頭資料抽象為源表,就像乙個storm任務必須至少定義乙個spout,乙個stream sql 任務必須至少定義乙個源表。
定義stream sql 源表的語法如下:
create table tablename
(columnname datatype [,columnname datatype]*)
[with (propertyname=propertyvalue [,propertyname=propertyvalue ] * )];
如下面的例子建立了乙個datahub型別的源表
create table datahub_stream(
name varchar,
age bigint,
birthday bigint)
with (
type ='datahub',
endpoint =『
project='blink-datahub_test',
topic ='test_topic_1',
accessid =0i70rrfjd1obawas',
accesskey ='yf60ewurseo1uan4ninvqpj2zhcfhu',
starttime='2018-08-20 00:00:00'
其中的type表示流式資料的源頭型別,可以為datahub,也可以為日誌或訊息中介軟體等,type下面的各個引數型別的不同而不同,它們共同確定了此type的某個源頭型別。
此外,阿里雲stream sql底層流計算引擎是flink/blink,因此其支援水位線機制。
定義水位線的語法如下:
watermark [watermarkname] for
as withoffset(,offset)
比如watermark for rowtime as withoffset(rowtime,4000)就對源頭資料列rowtime定義了固定延遲4s的水位線。
3.2 、stream sql 結果表
有源表,就是結果表,stream sql定義結果表的語法如下:
create table tablename
(columnname datatype [,columnname datatype]*)
[with (propertyname=propertyvalue [,propertyname=propertyvalue ] * )];
stream sql的結果表支援各種型別,包括類似mysql的rds、類似hbase的tablestore、類似訊息佇列的messagequeue的,下面以rds來介紹stream sql 結果表的具體語法:
create table rds_output(
id int,
len int,
content varchar,
primary key(id,len)
) with (
type ='rds',
url='jdbc:mysql:******',
tablename='test4',
username='test',
password='***x'
在上述**中,結果表的type不同,相應後面的其它引數也不一樣,具體可用參考阿里雲幫助文件。
3.3、stream sql維度表
流計算sql的維度表資料一類特殊的外部資料,相對流資料來說,他比較穩定且變化緩慢,是靜態或準靜態資料,作為join / left outer join的右表使用。需要特別注意的是,
維度表在流計算中不允許作為from 後面的資料儲存。流計算中對於from子句後對接的資料儲存一定是流式資料儲存,即 select * from dim_table是不被允許的。
阿里雲stream sql中沒有專門為維度表設計的ddl語法,使用標準的create table語法即可,但是需要額外增加一行period for system_time的宣告,這行宣告定義了
維度表的變化週期,即表明該表是一張會變化的表。
乙個簡單的維度表定義例項如下,type後面的語法類似源表定義,
create table white_list (
id varchar,
name varchar,
age int,
primary key(id), --用作維度表,必須有宣告的主鍵
period for system_time ---定義了維度表的變化週期
) with (
type = '***',
3.4、stream sql 臨時表
在實際的實時開發中,經常發現業務邏輯的複雜性使得只用乙個stream sql來完成所有的業務邏輯基本是不可能的,而必須拆分為多個sql共同完成,此時就需要定義中間臨時表(
在阿里雲stream sql 中也叫view,即檢視)。在stream sql中定義臨時表的語法如下:
create view viewname
[ (columnname[,columnname]*])]
as querystatement;
但需要注意的是,stream sql臨時表僅用於輔助計算邏輯表達的記憶體邏輯中間狀態,其物理是並不存在,也不會產生資料的物理儲存。當然,臨時表也不占用系統空間。乙個臨時表的例子
如下:create view largeorders(r, t, c, u) as
select rowtime, productid, c, units
from orders;
3.5、stream sql dml
stream sql語法和sql標準語法絕大部分都是相同的,下面僅著重介紹insert操作
insert操作的語法:
insert into tablename
[ ( columnname[,columnname]* )]
querystatement;
流計算不支援單獨select操作,當前在執行select查詢之前必須執行insert操作將結果儲存起來。同時,需要注意的是,乙個sql檔案支援多個源表輸入和多個結果表輸出。
只有result表和tmp表可以執行insert操作,且每張表只能執行一次insert操作,dim 表和stream表不能執行insert操作。
普通的select操作是從幾張表中讀資料,但查詢的物件也可以是另乙個select操作,也就是子查詢,但要注意子查詢必須加別名,例項如下:
insert into result_table
select * from (
select t.a, sum(t.b) as sum_b, from t1 t
group by t.a
) t1
where t1.sum_b>100;
初探大資料 開發環境介紹 實戰一
使用環境 1 centos 6.4 2 hadoop版本對比及選擇 生產較多的cdh版本 cdh5.7.0 cdh 5.7.0 生產或者測試環境選擇對應cdh版本時,一定要採用尾號是一樣的版本 為什麼很多公司選擇hadoop作為大資料平台的解決方案?1 原始碼開源 2 社群活躍 參與者很多 spar...
《實戰大資料》前言
實戰大資料 資料是重要資產 已成為大家的共識,眾多公司爭相分析 挖掘大資料背後的資訊財富。本書在這個背景下,對目前大資料及其相關技術的發展進行總結,理論聯絡實踐,既不缺乏理論深度又具有實用價值。前言隨著雲時代的來臨,大資料 big data 也吸引了越來越多的關注。大資料目前已經成為it領域最為流行...
大資料實戰 Hive 技巧實戰
select address from test where dt 20210218 union all select address from test where dt 20210218 address m a m a m b m b m b m b select address from te...