全部產品
Search
文件中心

Realtime Compute for Apache Flink:Window TVF

更新時間:Aug 06, 2024

本文為您介紹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文法,屬於未知相容變更。