AGG_STATE

description

  1. AGG_STATE不能作为key列使用,建表时需要同时声明聚合函数的签名。
  2. 用户不需要指定长度和默认值。实际存储的数据大小与函数实现有关。

AGG_STATE只能配合state /merge/union函数组合器使用。

需要注意的是,聚合函数的签名也是类型的一部分,不同签名的agg_state无法混合使用。比如如果建表声明的签名为max_by(int,int),那就无法插入max_by(bigint,int)或者group_concat(varchar)。 此处nullable属性也是签名的一部分,如果能确定不会输入null值,可以将参数声明为not null,这样可以获得更小的存储大小和减少序列化/反序列化开销。

example

建表示例如下:

  1. create table a_table(
  2. k1 int null,
  3. k2 agg_state max_by(int not null,int),
  4. k3 agg_state group_concat(string)
  5. )
  6. aggregate key (k1)
  7. distributed BY hash(k1) buckets 3
  8. properties("replication_num" = "1");

这里的k2和k3分别以max_by和group_concat为聚合类型。

插入数据示例:

  1. insert into a_table values(1,max_by_state(3,1),group_concat_state('a'));
  2. insert into a_table values(1,max_by_state(2,2),group_concat_state('bb'));
  3. insert into a_table values(2,max_by_state(1,3),group_concat_state('ccc'));

对于agg_state列,插入语句必须用state函数来生成对应的agg_state数据,这里的函数和入参类型都必须跟agg_state完全对应。

查询数据示例:

  1. mysql [test]>select k1,max_by_merge(k2),group_concat_merge(k3) from a_table group by k1 order by k1;
  2. +------+--------------------+--------------------------+
  3. | k1 | max_by_merge(`k2`) | group_concat_merge(`k3`) |
  4. +------+--------------------+--------------------------+
  5. | 1 | 2 | bb,a |
  6. | 2 | 1 | ccc |
  7. +------+--------------------+--------------------------+

如果需要获取实际结果,则要用对应的merge函数。

  1. mysql [test]>select max_by_merge(u2),group_concat_merge(u3) from (
  2. select k1,max_by_union(k2) as u2,group_concat_union(k3) u3 from a_table group by k1 order by k1
  3. ) t;
  4. +--------------------+--------------------------+
  5. | max_by_merge(`u2`) | group_concat_merge(`u3`) |
  6. +--------------------+--------------------------+
  7. | 1 | ccc,bb,a |
  8. +--------------------+--------------------------+

如果想要在过程中只聚合agg_state而不获取实际结果,可以使用union函数。

更多的例子参见datatype_p0/agg_state

keywords

  1. AGG_STATE