# 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