FLIP 70 Flink SQL計算列設計

2021-10-01 14:47:57 字數 2598 閱讀 6522

相容性、棄用和遷移計畫

測試計畫

當前狀態:已接受

討論線索:

jira:flink-14386 - support computed column for create table statement open在任務flink-10232中,我們在新模組flink-sql-parser中引入了create table語法。在設計文件flink sql ddl中,我們建議使用計算列來描述process time的時間屬性,因此使用者可以建立乙個具有process time屬性的表,如下所示:

create

table t1(

a int

, b bigint

, c varchar

, d as proctime,

)with

('k1'

='v1'

,'k2'

='v2'

);

d欄位將成為t1表的乙個process time屬性

除此之外,計算列還有以下作用:

ms-sql-2016[1]、mysql-5.6[2]和oracle-11g[3]中引入了計算列

計算列語法

結合ms-sql-2017[1]和mysql-5.6[2]的語法,我們提出計算列語法如下:

col_name as expr

[comment

'string'

]

限制:

initializerexpressionfactory

initializerexpressionfactory定義計算列值的生成策略。它將為每個虛擬列生成乙個rexnode,可以在邏輯計畫中使用它來派生我們想要的值。下面的圖表說明了它對select語句的工作原理:

tablecolumn描述表的列定義,包括列名、列資料型別和列策略的定義。

tableschema

tableschema描述用於內部和當前聯結器的表結構。

計畫重寫

假設我們有乙個名為t2的表,其schema如下:

create

table t2(

a int

, b as a +

1 virtual,

c bigint

, e varchar

)with

( k1=v1,

k2=v2

);

讀取如果t2表用作掃瞄表(source表),t2的列b將在掃瞄正上方的投影中計算。這意味著,我們將從掃瞄節點到掃瞄上方的投影進行等價轉換。

我們將為所有虛擬計算列新增投影表示式,tablesource行型別應排除這些虛擬列。

寫入

如果t2表用作插入目標表(sink表),t2列b被完全忽略,因為它是虛擬的(不儲存)。

我們將計算非虛擬列並將其插入到目標表中。tablesink行型別應排除這些虛擬列。

注意:這些計畫重寫發生在sql-to-rel轉換階段。

對於scan,從表示式計算虛擬列;從實際表源查詢儲存列。

對於sink,虛擬列被忽略;儲存的列在插入接收器時從表示式計算。

我們將擴充套件tableschema以支援計算列(我們應該始終在**中保留乙個tableschema,將來聯結器只能看到行型別,而不能看到tableschema,所以我們不應該擔心這個問題)

我們將引入乙個名為tablecolumn的新結構來儲存列名、列資料型別和列策略資訊。tableschema持有tablecolumn,而不是原始欄位名和字段資料型別。

在tableschema中,我們在推導行型別時總是忽略虛擬列。此行型別對應於source的輸出物理型別和sink的輸入物理型別。

我們將把tableschema的tablecolumn資訊放入catalogtable屬性中,這些屬性將用於持久化。對於每個列表示式,有三個項要持久化:

反序列化時,我們使用sqlparser將表示式字串解析為sqlnode,然後將其轉換為rexnode並應用投影。

這是乙個新功能,與舊版本的flink相容。我們可以擴充套件tablesourcetable以支援計算列介面,但這對使用者是透明的。

對於每個新特性,都可以使用單元測試來測試實現。我們還可以為聯結器新增整合測試,以驗證它是否可以與現有的source實現相容。

參考文獻

[1]

[2]

[3]

FLIP動畫思想

flip是一種助記縮寫也是一種 paul lewis首創 的技術,代表 first,last,invert,play。他的文章包含了對這一技術的乙個很好的解釋,但我會在這裡概括一下 first 記錄元素動畫前的位置和尺寸 last 記錄元素動畫後的位置和尺寸,可以直接修改style,讓元素瞬移過去 ...

vue之flip動畫解析

template div ul class container li v for item in base key item.id ref lis div class item style backgroundcolor item.c div li ul el button click sort 排...

CSS3實現翻轉 Flip 效果

今天,我們用比較簡潔的css3來實現翻轉效果。當滑鼠滑過包含塊時,元素整體翻轉180度,以實現 正 反 面的切換。分析 container,flip為了實現動畫效果做準備。front,back各包裹一張。實現該效果的html如下 1.元素布局 為了實現以上效果,先進行元素布局。給.front,bac...