最近更新

Apache Dolphinscheduler3.0.0-beta-1 版本釋出,新增FlinkSQL、Zeppelin任務類型

導讀:近日,Apache Dolphin Scheduler 迎來了 3.0.0-beta-1 版本的正式釋出。新版本主要針對 3.0.0-alpha 進行了代碼和文檔的修複,并引入了部分的功能,如支援 FlinkSQL 任務類型,新增 Zeppelin 任務類型,新增 Kubernetes namespace 管理功能,以及通過 bash 傳參功能等,具體更新詳見下文。

01 新功能

支援 FlinkSQL 任務類型

在該版本中,我們擴充了 Flink 任務類型,使其支援運作 Flink SQL 任務,其使用 sql-client.sh 送出任務。

更多詳情檢視:

flink sql client](https://nightlies.apache.org/flink/flink-docs-master/docs/dev/table/sqlclient/)

對應 PR:9840

【連結】

https://github.com/apache/dolphinscheduler/pull/9840

Apache Dolphinscheduler3.0.0-beta-1 版本釋出,新增FlinkSQL、Zeppelin任務類型

新增 Zeppelin 任務類型

在該版本中,我們增加了 Zeppelin 任務類型,用于建立并執行 Zeppelin 類型任務。Worker 執行該任務時,會通過 Zeppelin Cient API 觸發 Zeppelin Notebook 段落。

PR:9810

【連結】

https://github.com/apache/dolphinscheduler/pull/9810

Apache Dolphinscheduler3.0.0-beta-1 版本釋出,新增FlinkSQL、Zeppelin任務類型

新增 Kubernetes namespace 管理

該版本新增了 kubernetes namespace 管理功能,允許使用者在 Apache DolphinScheduler 中管理 Kubernetes 的 namespace。

PR:9303

【連結】:

https://github.com/apache/dolphinscheduler/pull/9303

新增通過shell元件擷取本地參數

新版本還新增了通過 bash 傳參的功能,如果你想在下遊任務中使用 bash 變量而不是常量值 export 參數,你可以在通過 setValue 和 Bash 變量實作,它更加靈活,可以讓你動态地擷取現有的本地或 HTTP 資源 擷取設定變量。

可以使用類似的文法:

Apache Dolphinscheduler3.0.0-beta-1 版本釋出,新增FlinkSQL、Zeppelin任務類型

PR:9586

【連結】

https://github.com/apache/dolphinscheduler/pull/9586

允許使用者上傳沒有字尾的檔案

之前資源中心隻能上傳有字尾的檔案,在 3.0.0-beta-1 版本後,我們支援使用者上傳沒有字尾的檔案。

02 Bug Fix

  • 3.0.0-alpha 各個部署方式出現的問題
  • 任務組為空時頁面報錯問題
  • treemap 視圖深度錯誤問題
  • 告警資訊不明确問題:告警組為空時報錯資訊不明确,批量删除工作流有異常時報錯資訊不明确,租戶内容錯長的錯誤提示,删除
  • 參數校驗問題:資料源中心的參數校驗問題,修改密碼時密碼不一緻提示,發告警前校驗 alert script
  • Python api:不能設定 release state 問題,本地參數有值但是校驗失敗問題
  • token 查詢不遵循時區問題
  • 修複 HTTPS 和 HTTP 字元串識别問題
  • 修複 alert server 健康監測失效問題
  • 修複 condition 任務分支失敗問題
  • 修複 docker 鏡像不支援多平台問題
  • 修複帶有任務組優先級的工作流建立時不能正确寫資料庫的問題
  • master 任務的失效問題
  • 修複串行等待不運作的問題
  • 時區問題:排程時區錯誤問題,日志增加時區支援
  • 重新運作、暫停工作流執行個體失敗問題
  • 資源中心執行個體化失敗問題

03 文檔修改 更正部署文檔

修複、更新部分使用文檔:WebexTeams 中文文檔,本地參數、全局參數文檔,Kubernetes FAQ 文檔,Spark 注意事項文檔,DataX 使用文檔,删除 Flink API 文檔,修複 open-api 的錯誤,修複資料品質中的錯誤文檔;新增 stand-alone 切換資料庫文檔;新增 shell 中判斷 Yarn 運作狀态文檔;新增更新系統截圖

04 具體修改

05 感謝 3.0.0-beta-1 版本貢獻者

【SQL】嵌套查詢與子查詢

前言

sql的嵌套查詢可以說是sql語句中比較複雜的一部分,但是掌握好了的話就可以提高查詢效率。下面将介紹帶

in

的子查詢、帶

比較運算符

any/all

exists

的子查詢以及基于

派生表

的子查詢。很多資料庫是不區分關鍵字大小寫的,并且關鍵字還會有高亮,是以我為了寫語句友善(不要頻繁切換大小寫或者按shift鍵)和看着友善(大寫一般還要在大腦中轉換下)關鍵字是使用小寫。

什麼是SQL嵌套查詢

嵌套查詢指的是

一個查詢語塊可以嵌套在另外一個查詢語句塊的where子句或者having子句中

,前者為子查詢或内查詢,後者為父查詢或外查詢。

表的定義

例子使用的表的定義為:

create table `student`(
	`sno` char(12) collate utf8_bin not null primary key comment '學号',
	`sname` char(30) collate utf8_bin not null comment '姓名',
	`birthday` Date collate utf8_bin comment '出生日期'
)engine=InnoDB default charset=utf8 collate=utf8_bin comment '學号資訊表';

create table `course`
(
	`cno` char(4) collate utf8_bin not null primary key comment '課程号',
	`cname` char(40) collate utf8_bin not null comment '課程名',
	`ceredit` smallint not null default 0 comment '學分'
)engine=InnoDB default charset=utf8 collate=utf8_bin comment '課程表';

create table `sc`
(
	`sno` char(12) collate utf8_bin not null comment '學号',
	`cno` char(4) collate utf8_bin not null comment '課程号',
	`score` smallint not null default 0 comment '成績'
)engine=InnoDB default charset=utf8 collate=utf8_bin comment '學生課程表';
#為sc表添加主鍵和外鍵
alter table `sc` add primary key (`sno`,`cno`);
alter table `sc` add foreign key(`sno`) references `student`(`sno`);
alter table `sc` add foreign key(`cno`) references `course`(`cno`);
           

帶in的子查詢

in關鍵字主要用于判斷表達式是否在多值清單中。傳回在多值清單中的記錄。

#列出選修了C001課程的學生的學号、姓名
select sno, sname
from student
where sno in (select sno from sc where cno='C001');
           

這裡子查詢裡面沒有依賴父查詢,此種查詢也叫做

不相關子查詢

若子查詢條件依賴于父查詢,則為

相關子查詢

帶比較運算符的子查詢

帶比較運算符的子查詢指父查詢與子查詢之間通過比較運算符連接配接,并且

子查詢傳回的是單值

,才可以用 = 、<、 >、 != 、>=、 <=等比較運算符連接配接。

#選出學号為2016110129的同學所選課程中的成績大于他平均成績的課程的課程号
select cno from sc as x
where score > 
(
	select avg(score) from sc as y where x.sno=y.sno and x.sno = '2016110129'
)
and sno = '2016110129';
           

這個子查詢依賴于父查詢,屬于

相關子查詢

因為這裡将同一張表既作為父查詢的表又作為子查詢的表,是以将這張表取了兩個别名,以便區分。

【查詢過程】:将父查詢中的sno代入子查詢中sno進行比對,然後判斷該記錄中的課程成績是否大于該學生的平均成績,符合條件則傳回該記錄,否則繼續在子查詢中比對該學生的下一條記錄。

帶any(some)或all的子查詢

子查詢傳回單值時的比較,可以用上面的比較運算符,當傳回多值時需要比較,就要使用any(some)或者all。

若是在與多值序列的比較中,隻需要滿足與多值序列中的

一個值

滿足比較關系就傳回true,則用any(some)。

若是在與多值序列的比較中,需要滿足與多值序列中的

全部值

滿足比較關系才傳回true,則用all。

#查詢選課人數最多的課程号
select cno from sc
group by cno
having COUNT(*) >= all(select COUNT(*) from sc group by cno);
           

【查詢過程】:将sc表中的記錄按照cno進行分組,篩選記錄數最多的課程号。

all(select COUNT(*) from sc group by cno)
           

是找出所有以cno分組的記錄數,是一個多值集合。使用>=也就是選出最大的值。

帶exists的子查詢

exists代表存在量詞,帶有EXISTS的子查詢

不傳回任何資料,隻産生邏輯真值“true”或者邏輯假值“false”

使用exists的嵌套語句,若子查詢結果不為空,則exists傳回true,否則傳回false。

使用exists引出的子查詢,其目标表達式列都使用*,因為帶exists的子查詢隻傳回真值或假值,給出列名無實際含義。

#列出選修了C001課程的學生的學号、姓名
select sno,sname from student
where exists(
select * from sc where sc.sno=student.sno and cno='C001'
);
           

【查詢過程】:從student的第一條記錄開始查詢,将第一條記錄代入子查詢中,在sc表中比對該學生選課記錄,若比對到則立刻傳回真,父查詢中輸出該記錄;若比對完後結果仍為空,否則傳回假,繼續父查詢繼續代入下一條記錄到子查詢中查詢。

與in子查詢的差別

在帶in的子查詢中,會周遊sc表中所有記錄進行篩選,帶exists的查詢找到一條記錄就傳回,不會周遊整個表,是以帶EXISTS的查詢是一個優質查詢。

附加一題作為exists的練習

“查詢選了所有課程的學生”

這裡需要使用雙層帶not exists(即不存在)關鍵詞的查詢。具體查詢語句如下:

#查詢選了所有課程的學生
select sno,sname from student where not exists(
	select * from course where not exists (
		select * from sc where sc.sno=student.sno and sc.cno=course.cno
	)
);
           

這個相當于一個進行一個雙重循環,因為是選出學生的資訊,是以student表作為“外層循環”,course表作為“内循環”,在sc表中查詢學生的選課記錄是否存在。

把student表中第一個學生代入“内循環”,然後開始,在sc表中查詢該學生是否選了course表中所有課程。

如果周遊了course表後,不存在沒有被選的課程(課程在sc表中沒有記錄),則說明該學生選了所有課程,内部not exists就會傳回假,外部not exists傳回為真,說明該學生不存在沒有選的課程,外部查詢輸出該學生的資訊,然後開始下一個學生的查詢。

在周遊course表時,若有一個課程沒有被選,則内部就會立刻傳回真(不會繼續看下一門課程是否被選),外部查詢傳回為假,說明該學生沒有選完所有課程,外部查詢就會開始下一個學生的查詢。

再附加一個練習

“找出被所有學生選了的課程的課程号和課程名”
select cno,cname from course where not exists(
	select * from student where not exists (
		select * from sc where sc.sno=student.sno and sc.cno=course.cno
	)
);
           

基于派生表的查詢

select 查詢的結果也是一張表,可以作為出現在from子句後面作為派生表進行查詢。

#求學分獲得8分以上學生的學号 平均分  以及總學分  
#需要注意此處的作用域不同,隻有該課程的成績大于60才會獲得該課程的學分,平均分包括了所有課程(不及格和及格)
#思路:先将查詢到的總學分結果看做是一張表 再與sc表連接配接進行查詢平均分
select sc.sno,total_cre,avg(score) from
	(select sno,SUM(ceredit) as total_cre from sc,course where sc.cno=course.cno 
	and score >= 60
	group by sno 
	having SUM(ceredit) >= 8) as temptable, sc
where temptable.sno=sc.sno 
group by sc.sno,sum_cre;
           

小結

回顧了學習資料庫時的嵌套查詢,簡單總結了一番。當時覺得其中比較難了解的exists查詢,現在梳理了一下了解起來也沒有那麼困難。sql語句還是要常寫,不然一些邏輯複雜點的語句就會了解不到。

每天進步一點點,不要停止前進的腳步~