本文为您介绍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语法,属于未知兼容变更。