AGG_STATE
AGG_STATE
説明
AGG_STATEはキー列として使用することができず、Table作成時に集約関数のシグネチャを同時に宣言する必要があります。 ユーザーは長さとデフォルト値を指定する必要はありません。実際に格納されるデータサイズは関数の実装に関連します。
AGG_STATEはstate/merge/union関数コンビネータでのみ使用できます。
集約関数のシグネチャも型の一部であることに注意が必要です。異なるシグネチャのagg_stateを混在させることはできません。例えば、Table作成文のシグネチャがmax_by(int,int)の場合、max_by(bigint,int)やgroup_concat(varchar)を挿入することはできません。
ここでのnullable属性もシグネチャの一部です。null値が入力されないことを確認できる場合、パラメータをnot nullとして宣言することで、より小さなストレージサイズを取得し、シリアライゼーション/デシリアライゼーションのオーバーヘッドを削減できます。
注意: agg_stateは集約関数の中間結果を格納するため、読み書きプロセスは集約関数の具体的な実装に強く依存しています。Dorisバージョンアップグレード中に集約関数の実装が変更された場合、非互換性の問題が発生する可能性があります。非互換性が発生した場合、対応するagg_stateを使用するマテリアライズドビューは削除して再作成する必要があり、関連する基盤集約Tableは直接利用できなくなります。そのため、agg_stateは慎重に使用する必要があります。
例
Table作成例:
-- after doris-2.1.1
create table a_table(
k1 int null,
k2 agg_state<max_by(int not null,int)> generic,
k3 agg_state<group_concat(string) generic
)
aggregate key (k1)
distributed BY hash(k1) buckets 3
properties("replication_num" = "1");
-- until doris-2.1.0
create table a_table(
k1 int null,
k2 agg_state max_by(int not null,int),
k3 agg_state group_concat(string)
)
aggregate key (k1)
distributed BY hash(k1) buckets 3
properties("replication_num" = "1");
ここで、k2 と k3 はそれぞれ集約タイプとして max_by と group_concat を使用します。
データ挿入例:
insert into a_table values(1,max_by_state(3,1),group_concat_state('a'));
insert into a_table values(1,max_by_state(2,2),group_concat_state('bb'));
insert into a_table values(2,max_by_state(1,3),group_concat_state('ccc'));
agg_state列の場合、insert文ではstate関数を使用して対応するagg_stateデータを生成する必要があります。ここで、関数と入力パラメータの型はagg_stateと完全に対応している必要があります。
データ選択の例:
mysql [test]>select k1,max_by_merge(k2),group_concat_merge(k3) from a_table group by k1 order by k1;
+------+--------------------+--------------------------+
| k1 | max_by_merge(`k2`) | group_concat_merge(`k3`) |
+------+--------------------+--------------------------+
| 1 | 2 | bb,a |
| 2 | 1 | ccc |
+------+--------------------+--------------------------+
実際の結果を取得する必要がある場合は、対応するmerge関数を使用する必要があります。
mysql [test]>select max_by_merge(u2),group_concat_merge(u3) from (
select k1,max_by_union(k2) as u2,group_concat_union(k3) u3 from a_table group by k1 order by k1
) t;
+--------------------+--------------------------+
| max_by_merge(`u2`) | group_concat_merge(`u3`) |
+--------------------+--------------------------+
| 1 | ccc,bb,a |
+--------------------+--------------------------+
処理中に実際の結果を取得せずにagg_stateのみを集約したい場合は、union関数を使用できます。
より多くの例については、datatype_p0/agg_stateを参照してください。
keywords
AGG_STATE