本文為您介紹Window TVF變更的可兼容性和不可兼容性詳情。
可兼容的變更
新增、刪除、修改非Distinct的統計指標(Aggregate Function)。
對于新增統計指標,屬于部分兼容,從當前作業啟動時開始累計。
對于刪除統計指標,屬于完全兼容變更。刪除的統計指標對應的狀態數據會被丟棄。
對于既有新增又有刪除統計指標,則屬于部分兼容變更。新增的統計指標從當前作業啟動時開始累計,刪除的統計指標對應的狀態數據會被丟棄。
對于修改統計指標,被視為刪除和新增兩個操作,屬于部分兼容變更。新增的統計指標從當前作業啟動時開始累計,刪除的統計指標對應的狀態數據會被丟棄。
說明對于未進行任何變更的統計指標,復用狀態數據后計算的結果和基于歷史數據運行的結果是一致的。
-- 原始SQL。 select a, sum(b), max(c) from table (tumble(table MyTable, descriptor(ts), interval '1' minute)) group by a, window_start, window_end; -- 新增統計指標:count(c),屬于部分兼容變更。 -- sum(b)、max(c)的計算結果不受影響,count(c)的值在作業啟動時從0開始累計。 select a, sum(b), max(c), count(c) from table (tumble(table MyTable, descriptor(ts), interval '1' minute)) group by a, window_start, window_end; -- 刪除統計指標:sum(b),屬于完全兼容變更。 -- max(c)的計算結果不受影響。 select a, max(c) from table (tumble(table MyTable, descriptor(ts), interval '1' minute)) group by a, window_start, window_end; -- 修改統計指標:max(c) -> min(c),屬于部分兼容變更。 -- sum(b)的計算結果不受影響。max(c)被認為刪除,其對應的狀態數據會被丟棄。 -- min(c)被認為是新增指標,其值在作業啟動時開始計算。 select a, sum(b), min(c) from table (tumble(table MyTable, descriptor(ts), interval '1' minute)) group by a, window_start, window_end;
調整非Distinct的統計指標位置,該修改屬于完全兼容變更。
-- 原始SQL。 select a, sum(b), max(c) from table (tumble(table MyTable, descriptor(ts), interval '1' minute)) group by a, window_start, window_end; -- 調整統計指標位置:sum(b)、max(c),屬于完全兼容變更。 -- sum(b)、max(c) 的計算結果不受影響。 select a, max(c), sum(b) from table (tumble(table MyTable, descriptor(ts), interval '1' minute)) group by a, window_start, window_end;
當非Distinct的統計指標涉及的字段有計算邏輯變化時,該統計指標被認為做了修改操作,該修改屬于部分兼容變更。
-- 原始SQL。 select a, sum(b), max(c) from table (tumble(table MyTable, descriptor(ts), interval '1' minute)) group by a, window_start, window_end; -- 修改統計指標:max(c) -> max(substring(c, 1, 5)),屬于部分兼容變更。 -- sum(b)的計算結果不受影響。max(c)被認為刪除,其對應的狀態數據會被丟棄。 -- max(substring(c, 1, 5)) 被認為新增指標,其值在作業啟動時開始計算。 create temporary view MyView select a, b, substring(c, 1, 5) as c, ts from MyTable; select a, sum(b), max(c) from table (tumble(table MyView, descriptor(ts), interval '1' minute)) group by a, window_start, window_end;
新增、刪除window屬性字段,該修改屬于完全兼容變更。
-- 原始SQL。 select a, sum(b), max(c), window_start from table (tumble(table MyTable, descriptor(ts), interval '1' minute)) group by a, window_start, window_end; -- 新增window end屬性,該修改屬于完全兼容變更。 select a, sum(b), max(c), window_start, window_end from table (tumble(table MyTable, descriptor(ts), interval '1' minute)) group by a, window_start, window_end; -- 刪除window start屬性,該修改屬于完全兼容變更。 select a, sum(b), max(c) from table (tumble(table MyTable, descriptor(ts), interval '1' minute)) group by a, window_start, window_end;
變更前后都沒有統計指標,屬于完全兼容變更。
修改Group Key順序,窗口相關的Key的順序變化,但是普通Group Key相對順序不變,屬于完全兼容變更。
-- 原始SQL。 select a, sum(b), max(c) from table (tumble(table MyTable, descriptor(ts), interval '1' minute)) group by a, c, window_end, window_start; -- 窗口相關的Key發生順序變化,屬于完全兼容變更。 select a, sum(b), max(c) from table (tumble(table MyTable, descriptor(ts), interval '1' minute)) group by a, window_end, c, window_start;
不兼容的變更
修改window相關屬性(window的類型,window的大小,時間相關屬性),該修改屬于不兼容變更。
--原始SQL。 select a, sum(b), max(c), window_start from table (tumble(table MyTable, descriptor(ts), interval '1' minute)) group by a, window_start, window_end; -- 修改window類型:tumble -> hop,該修改屬于不兼容修改。 select a, sum(b), max(c), hop_start(ts, interval '1' minute, interval '2' minute) as window_start from MyTable group by a, hop(ts, interval '1' minute, interval '2' minute); -- 修改window大小:'1' minute -> '2' minute,該修改屬于不兼容修改。 select a, sum(b), max(c), tumble_start(ts, interval '2' minute) as window_start from MyTable group by a, tumble(ts, interval '2' minute); -- 修改時間相關屬性:ts -> proctime,該修改屬于不兼容修改。 select a, sum(b), max(c), tumble_start(ts, interval '1' minute) as window_start from MyTable group by a, tumble(proctime, interval '1' minute);
新增、刪除、修改統計維度(group key)或者統計維度涉及字段的計算邏輯發生變化,該修改屬于不兼容變更。
-- 原始SQL。 select a, sum(b), max(c), tumble_start(ts, interval '1' minute) as window_start from MyTable group by a, tumble(ts, interval '1' minute); -- 新增統計維度:d,該修改屬于不兼容修改。 select a, sum(b), max(c), tumble_start(ts, interval '1' minute) as window_start from MyTable group by a, d, tumble(ts, interval '1' minute); -- 其他示例可參考Group Aggregate修改group key示例。
新增、刪除、修改Distinct統計指標(distinct aggregate function)或者Distinct統計指標涉及字段的計算邏輯發生變化,該修改屬于不兼容變更。
-- 原始SQL。 select a, sum(b), count(distinct b), max(c), count(distinct c), tumble_start(ts, interval '1' minute) as window_start from MyTable group by a, tumble(ts, interval '1' minute); -- 新增Distinct統計指標:count(distinct b),該修改屬于不兼容修改。 select a, sum(b), max(c), count(distinct c), tumble_start(ts, interval '1' minute) as window_start from MyTable group by a, tumble(ts, interval '1' minute); -- 其他示例可參考Group Aggregate修改Distinct統計指標示例。
刪除了所有統計指標,該修改屬于不兼容變更。(所有統計指標的狀態數據都被丟棄,沒有狀態復用。)
-- 原始SQL。 select a, sum(b), count(distinct b), max(c), count(distinct c), tumble_start(ts, interval '1' minute) as window_start from MyTable group by a, tumble(ts, interval '1' minute); -- 刪除所有統計指標:sum(b), max(c),該修改屬于不兼容修改。 select a, tumble_start(ts, interval '1' minute) as window_start from MyTable group by a, tumble(ts, interval '1' minute);
修改Group Key順序,普通Group Key間順序變化,但是窗口Group Key順序不變,屬于不兼容變更。
-- 原始SQL。 select a, sum(b), max(c) from table (tumble(table MyTable, descriptor(ts), interval '1' minute)) group by a, c, window_end, window_start; -- 普通 Group Key間順序變化,屬于不兼容變更。 select a, sum(b), max(c) from table (tumble(table MyTable, descriptor(ts), interval '1' minute)) group by c, a, window_end, window_start;
變更前沒有任何一個統計指標,而變更后加入新的統計指標,屬于不兼容變更。
-- 原始SQL。 select a, b from table (tumble(table MyTable, descriptor(ts), interval '1' minute)) group by a, b, window_end, window_start; -- 加入新的統計指標,屬于不兼容變更。 select a, b, count(a) from table (tumble(table MyTable, descriptor(ts), interval '1' minute)) group by a, b, window_end, window_start;
變更前后僅有一個統計指標,并且修改了計算邏輯,屬于不兼容變更。
-- 原始SQL。 insert into MySink select a, sum(b) from table(tumble(table MyTable, descriptor(ts), interval '1' second)) group by a, window_start, window_end; -- 僅有一個統計指標,并修改計算邏輯,屬于不兼容變更。 create temporary view MyView as select a, b + 1 as b, ts from MyTable; insert into MySink select a, sum(b) from table(tumble(table MyView, descriptor(ts), interval '1' second)) group by a, window_start, window_end;
變更前后任何一個統計指標都不同,屬于不兼容變更。
-- 原始query insert into MySink select a, sum(b) from table(tumble(table MyTable, descriptor(ts), interval '1' second)) group by a, c, window_start, window_end; -- 任何一個統計指標發生變化,屬于不兼容變更。 insert into MySink select a, min(b) from table(tumble(table MyTable, descriptor(ts), interval '1' second)) group by a, c, window_start, window_end;
窗口函數和聚合語句之間,對window_start、window_end和window_time字段的計算。
變更后新加了計算,屬于不兼容變更。
變更后刪除了計算,屬于不兼容變更。
-- 原始SQL。 select a, sum(b), max(c), window_start,window_end from (select a, b, c, window_start, window_end from table (tumble(table MyTable, descriptor(ts), interval '1' minute))) group by a, window_start, window_end; -- 增加計算。 select a, sum(b), max(c), window_start,window_end from (select a, b, c, window_start + (INTERVAL '1' SECOND) as window_start, window_end from table (tumble(table MyTable, descriptor(ts), interval '1' minute))) group by a, window_start, window_end;
聚合語句的GROUP KEY中未同時包含window_start和window_end。
變更前同時包含,變更后未同時包含,屬于不兼容變更。
變更前未同時包含,變更后同時包含,屬于不兼容變更。
-- 原始SQL。 select a, sum(b), max(c), window_start from (select a, b, c, window_start from table (tumble(table MyTable, descriptor(ts), interval '1' minute))) group by a, window_start; -- 同時包含window_start和window_end select a, sum(b), max(c), window_start,window_end from (select a, b, c, window_start, window_end from table (tumble(table MyTable, descriptor(ts), interval '1' minute))) group by a, window_start, window_end;
聚合函數使用GROUPING SETS、CUBE或ROLLUP語法,導致window_start和window_end不在同一組GROUP KEY中。
變更后使用GROUPING SETS、CUBE或ROLLUP語法,屬于不兼容變更。
變更后刪除了GROUPING SETS、CUBE或ROLLUP語法,屬于不兼容變更。
-- 原始SQL。 select a, sum(b), max(c), window_start, window_end from (select a, b, c, window_start, window_end from table (tumble(table MyTable, descriptor(ts), interval '1' minute))) group by a, window_start, window_end; -- 增加GROUPING SETS語法。 select a, sum(b), max(c), window_start, window_end from (select a, b, c, window_start, window_end from table (tumble(table MyTable, descriptor(ts), interval '1' minute))) group by GROUPING sets((a), (window_start), (window_end));
未知兼容變更
窗口函數和聚合語句之間,對window_start、window_end和window_time字段的計算。
變更前后都有計算,屬于未知兼容變更。
窗口函數和聚合語句之間,對window_start、window_end和window_time字段的過濾。
變更后增加過濾,屬于未知兼容變更。
變更后刪除過濾,屬于未知兼容變更。
變更前后都有過濾,屬于未知兼容變更。
-- 原始SQL。 select a, sum(b), max(c), window_start,window_end from (select a, b, c, window_start, window_end from table (tumble(table MyTable, descriptor(ts), interval '1' minute))) group by a, window_start, window_end; -- 增加過濾SQL。 select a, sum(b), max(c), window_start,window_end from (select a, b, c, window_start, window_end from table (tumble(table MyTable, descriptor(ts), interval '1' minute)) WHERE window_start >= TIMESTAMP '2024-04-15 08:06:00.000') group by a, window_start, window_end;
窗口函數和UDTF同時使用。
變更后增加了UDTF函數,屬于未知兼容變更。
變更后刪除了UDTF函數,屬于未知兼容變更。
變更前后都有UDTF函數,屬于未知兼容變更。
-- 原始SQL。 select a, sum(b), length(c), window_start,window_end from ( select a, b, c, window_start,window_end from table (tumble(table MyTable, descriptor(ts), interval '1' minute))) group by a,c, window_start,window_end; -- 增加UDTF函數。 select a, sum(b), length(c), window_start, window_end, c1, c2 from (select a, b, c, window_start, window_end, c1, c2 from table (tumble(table MyTable, descriptor(ts), interval '1' minute)), LATERAL TABLE(split(c)) as T(c1, c2)) group by a,c, window_start, window_end, c1, c2;
聚合函數使用python UDAF。
變更后新增了python UDAF函數,屬于未知兼容變更。
變更后刪除了python UDAF函數,屬于未知兼容變更。
變更前后都有python UDAF函數,屬于未知兼容變更。
-- 原始SQL。 select a, sum(b), max(c), window_start from (select a, b, c, window_start from table (tumble(table MyTable, descriptor(ts), interval '1' minute))) group by a, window_start; -- 增加python UDAF函數。 select a, sum(b), c, window_start from (select a, b, weighted_avg(c) as c, window_start from table (tumble(table MyTable, descriptor(ts), interval '1' minute)) GROUP by a,b,window_start) group by a,c, window_start;
聚合語句中的聚合函數,對窗口列window_start、window_end和window_time進行計算。
變更后新增聚合函數計算,屬于未知兼容變更。
變更后刪除聚合函數計算,屬于未知兼容變更。
變更后前后都有聚合函數計算,屬于未知兼容變更。
-- 原始SQL。 select a, sum(b), max(c), window_start, window_end from (select a, b, c, window_start, window_end from table (tumble(table MyTable, descriptor(ts), interval '1' minute))) group by a, window_start, window_end; -- 增加聚合函數計算。 select a, sum(b), max(c), MAX(window_start) as ag, window_end from (select a, b, c, window_start, window_end from table (tumble(table MyTable, descriptor(ts), interval '1' minute))) group by (a, window_start, window_end);
聚合函數使用GROUPING SETS、CUBE和ROLLUP語法,導致window_start和window_end不在同一組GROUP KEY中。
變更前后都使用GROUPING SETS、CUBE和ROLLUP語法,屬于未知兼容變更。