# udaf
## AggregateUDFImpl
## Accumulator
- 用于执行实际的聚合。
----------
# Groups
## GroupAccumulator trait
### Trait Doc
- 一个 GroupAccumulator 对应==一个==聚合函数(如 AVG),内部管理==所有== groups 的状态。
- 所有的聚合都必须先实现更简单的 `Accumulator` trait,它处理单个 group 的 state。
- 实现 GroupsAccumulator 是==可选==的,更难,但是当 group 基数大时会更快。
- 每个 group 通过 hash table 分配一个 `group_index`,每个 accumulator 管理特定的 state,每个 group index 一个。
- groups indexes 是连续的(没有间隙),因此一般使用 Vec 来存储 group states。
### Trait Methods
- **update_batch**
- 更新 accumulator 的状态,encoded as a vector of ArrayRef
- 参数:
- **values:** `&[ArrayRef]` ,聚合的输入参数们
- **group_indices**: `&[usize]`, values 中的 rows 分别属于哪个 groups
- **opt_filter**:`Options<&BooleanArray>`: 如果存在,则
- **total_num_groups**: `usize`:当前总的 groups 的数量,最大的 group_index 为 `total_num_groups - 1`
- **evalute**
- 返回每个 group 的最终聚合结果,形式为一个 RecordBatch,并且重置内部状态。
- 返回的 rows 必须按照 group index 有序,即 group_index 0 的值,再跟 group_index 1 的,依次类推,没有值的返回 NULL。
- 可以指定只返回前 N 个 groups。这时会移除前 N 个 groups 的状态。
- 后续调用 update_batch 或者 merge_batch 时,group_indices 参数应该剪去 N。
- **state**
- 返回 itermediate 聚合状态,用于多阶段 grouping,并且重置内部状态。
- 例如 `AVG` 会返回两个 arrays:`SUM` 和 `COUNT`;`MIN`会只返回一个 array。
- 复杂的内部状态可以使用一个 `StructArray`, 而不是多个 arrays。
## NullState