
# Hudi支持聚合函数
#### 操作场景
当前开源社区提供了可插拔的Payload机制，用于满足客户各种聚合需求。但Payload的开发有一定的门槛，因此MRS内置了一些常见的聚合函数满足客户日常需求。该特性允许用户使用Hudi自带的聚合函数，轻松实现相同主键的聚合操作，从而简化数据处理流程，提高数据处理效率。
**典型应用场景：**
- 实时指标统计：对相同用户ID的访问次数进行count累加，统计UV/PV等实时指标。
- 增量数据累加：对相同账户ID的交易金额进行sum求和，实现账户余额的实时更新。
- 设备状态合并：对相同设备ID的传感器数据使用last_value取最新状态，实现设备状态合并。
- 数据去重保留极值：对相同主键的数据使用max/min保留最大/最小值，实现数据去重与极值筛选。
 
#### 约束与限制
- 本章节内容仅适用于MRS 3.5.0-LTS及之后版本。
- 由于Hudi OCC特性的限制，当前不建议多流并发写Hudi表。 如果需要多流同时写请将所有流union后写入Hudi。
- 适合批读获取结果。
- 当前支持的聚合函数和数据类型如下：
  - sum：求和函数可以跨多行聚合值，支持DECIMAL（小数）、SHORT（小整数）、INTEGER（整数）、BIGINT（大整数）、FLOAT（浮点数）和DOUBLE（双精度浮点数）数据类型。
  
  - product：乘积函数可以计算多行的乘积值，支持DECIMAL、SHORT、INTEGER、BIGINT、FLOAT和DOUBLE数据类型。
  
  - count：计数函数可以跨多行计数值，支持INTEGER（整数）和BIGINT（大整数）数据类型。
  
  - max：最大值函数可以识别并保留最大值，支持STRING、DECIMAL、SHORT、INTEGER、BIGINT、FLOAT、DOUBLE、DATE、TIMESTAMP数据类型。
  
  - min：最小值函数可以识别并保留最小值，支持STRING、DECIMAL、SHORT、INTEGER、BIGINT、FLOAT、DOUBLE、DATE、TIMESTAMP数据类型。
  
  - last_value：最后值函数用最近导入的值替换之前的值，支持所有数据类型。
  
  - last_non_null_value：非空最后值函数用最新的非空值替换之前的值，支持所有数据类型。
  
  - first_value：第一个值函数检索数据集中的第一个空值，支持所有数据类型。
  
  - first_non_null_value：非空第一个值函数选择数据集中的第一个非空值，支持所有数据类型。
   
 
#### 开启聚合引擎
建表属性中指定hoodie.merge-engine=aggregate开启Hudi表的聚合引擎功能。开启聚合引擎后，每个非主键字段都可以被赋予一个聚合函数，通过字段的fields.\<**field-name**\>.aggregate-function表属性来指定。例如，考虑以下表定义。
```
create table if not exists testTable(
id INT,
col1 INT,
col2 INT,
col3 INT,
col4 INT,
ts LONG
) using hudi
tblproperties (
primaryKey = 'id',
preCombineField='ts',
type = 'mor',
'hoodie.merge-engine' = 'aggregate',
'fields.col2.aggregate-function' = 'count',  -----  指定针对col2 按主键聚合做count操作
'fields.col3.aggregate-function' = 'max'  -----  指定针对col3 按主键聚合取max操作
);
```
#### 相关文档
- 了解Hudi表的完整建表语法和参数说明，具体请参考[使用Spark SQL操作Hudi表](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_300441.html)。
- 了解Hudi表的写入、Compaction、Cleaning等参数配置方法，具体请参考[Hudi常见参数配置](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_24032.html)。
- **常见问题：**
  - **聚合结果不正确**：请检查建表语句中hoodie.merge-engine是否配置为aggregate、各字段的aggregate-function是否与数据类型匹配（参见约束限制中的函数数据类型支持表）、preCombineField是否正确指定了用于判断数据新旧的字段。
  
  - **不支持的数据类型如何处理**：对于聚合函数不支持的数据类型（如array、map等复杂类型），建议使用last_value或last_non_null_value函数，或通过自定义Payload实现。
  
  - **cow类型表是否支持聚合引擎**：聚合引擎建议使用mor类型表。cow类型表在写入时即合并数据，聚合操作在写入阶段执行，可能与mor类型的行为存在差异，建议使用mor类型以确保聚合结果正确。
  
  - **聚合函数配置后能否修改**：已创建表的聚合函数配置不支持直接修改。如需更改聚合函数，需删除原表后重新创建并指定新的聚合函数配置。
   
 
