
# 概述
#### 功能描述
Remote UDAF（Remote User-Defined Aggregate Function）为用户自定义聚合函数，适用于多进一出业务场景。即其输入与输出是多对一的关系，将多条输入记录聚合成一个输出值。
本节内容以FunctionGraph作为Remote UDAF 的执行载体，介绍开发Remote UDAF到计算引擎调用的操作步骤。
#### 方案优势
Remote UDAF的优势在于风险隔离、资源解耦与成本优化。
- 风险隔离：当关键生产环境需要执行UDAF时，虽然技术上支持，但存在执行风险。 通过Remote UDAF将计算逻辑卸载到函数工作流FunctionGraph，既能保持业务功能，又能通过无服务器架构实现风险隔离。
  
- 资源解耦：对于大模型推理等计算密集型任务，为避免在Spark等集群中长期占用昂贵资源，兼顾功能需求、稳定性和成本效益，将计算密集型操作剥离至FunctionGraph执行
- 成本优化：Remote UDAF将default队列还原为纯数据通道，消除UDAF引发的风险，使其能为用户提供更经济，更安全的核心数据流服务。
 
#### 约束与限制
Remote UDAF只对单行数据产生作用，适用于单进单出的场景。
#### 环境准备
使用FunctionGraph开发调试Remote UDAF时，您需要先安装IDEA并配置Maven，下载依赖JAR包并配置FunctionGraph服务，做好Remote UDAF开发前准备工作。
表1UDAF开发环境 
| 准备项                | 说明                                                                                                                                                                                                      |
|:---|:---|
| 操作系统               | Windows系统，支持Windows7以上版本。                                                                                                                                                                               |
| 安装JDK              | JDK使用1.8版本。                                                                                                                                                                                             |
| 安装和配置IntelliJ IDEA | IntelliJ IDEA为进行应用开发的工具，版本要求使用2019.1或其他兼容版本。                                                                                                                                                            |
| 安装Maven            | 开发环境的基本配置。用于项目管理，贯穿软件开发生命周期。                                                                                                                                                                            |
| 下载依赖JAR包           | 依赖引入下载Jar包：spark-function-sdk_2.13-jar-with-dependencies.jar 获取方式：从https://repo.huaweicloud.com/repository/maven/huaweicloudsdk/地址下载。 |
   
#### UDAF与Remote UDAF的对比
- UDAF：适合对性能要求高且熟悉查询引擎开发语言的场景。执行效率高，但开发灵活性和安全性相对较低。
- Remote UDAF：适合需要调用外部服务、使用多种语言开发或对开发语言灵活性要求高的场景。具有较高的安全性和开发灵活性。
表2UDAF与Remote UDAF的对比 
| 特性    | UDAF                        | Remote UDAF                 |
|:---|:---|:---|
| 执行方式  | 在查询引擎本地执行                   | 通过调用函数托管服务执行                |
| 安全性   | 若UDAF代码不稳定，可能影响查询引擎进程       | 执行失败仅影响UDAF自身，不会导致整体作业进程。   |
| 性能    | 执行效率高                       | 但在向量化和批处理模式下，性能与本地UDAF相当    |
| 开发灵活性 | 与查询引擎代码耦合度高，开发限制较多          | 灵活，可调用任意其他服务或程序库，满足多样业务需求   |
| 开发成本  | 需熟悉查询引擎的开发环境和语言，开发成本较高      | 一次性开发投入，开发成本相对较低            |
| 适用场景  | 对性能要求极高的场景，且开发团队熟悉查询引擎的开发语言 | 对开发语言灵活性要求高、需要调用外部服务或程序库的场景 |
   
#### UDF、UDAF和UDTF的对比
- UDF：创建一个计算两个数字之和的函数。
- UDAF：创建一个计算平均值的函数。
- UDTF：创建一个函数，用于将一个包含多个值的字符串拆分成多行。
表3UDF、UDAF和UDTF的对比 
| 特性   | UDF（User-Defined Function） | UDAF（User-Defined Aggregate Function） | UDTF（User-Defined Table-Generating Function） |
|:---|:---|:---|:---|
| 输入参数 | 一行数据的一个或多个字段               | 多行数据的多个字段                             | 一行或多行数据的一个或多个字段                              |
| 输出结果 | 单个标量值                      | 单个聚合结果                                | 多行数据，每行可以有多个字段                               |
| 主要用途 | 简单的数据转换和计算，如字符串处理、数学运算等    | 数据聚合计算，如求和、平均值、计数等                    | 数据展开和复杂结构解析，如拆分字符串、展开数组等                     |
   
- **UDF示例** ：
  创建一个函数，将输入的数字加1。
  ```
  CREATE FUNCTION add_one AS 'com.example.AddOneUDF';
  SELECT add_one(age) FROM users;
  ```
  假设users表中有一列age，值为25，该函数会输出26。
  
- **UDAF示例** ：
  计算某一列的最大值。
  ```
  CREATE FUNCTION max AS 'com.example.MaxUDAF';
  SELECT max(age) FROM users;
  ```
  假设users表中有一列age，值为25, 30, 35，该函数会输出35。
  
- **UDTF示例** ：
  将一个JSON字符串解析为多行数据。
  ```
  CREATE FUNCTION parse_json AS 'com.example.ParseJsonUDTF';
  SELECT parse_json(json_column) FROM users;
  ```
  假设users表中有一列json_column，值为'{"name":"Alice","age":25},{"name":"Bob","age":30}'，该函数会输出两行，每行包含解析后的name和age字段。
  
 
