更新时间:2026-07-28 GMT+08:00
分享

概述

功能描述

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开发前准备工作。

表1 UDAF开发环境

准备项

说明

操作系统

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:适合需要调用外部服务、使用多种语言开发或对开发语言灵活性要求高的场景。具有较高的安全性和开发灵活性。
表2 UDAF与Remote UDAF的对比

特性

UDAF

Remote UDAF

执行方式

在查询引擎本地执行

通过调用函数托管服务执行

安全性

若UDAF代码不稳定,可能影响查询引擎进程

执行失败仅影响UDAF自身,不会导致整体作业进程。

性能

执行效率高

但在向量化和批处理模式下,性能与本地UDAF相当

开发灵活性

与查询引擎代码耦合度高,开发限制较多

灵活,可调用任意其他服务或程序库,满足多样业务需求

开发成本

需熟悉查询引擎的开发环境和语言,开发成本较高

一次性开发投入,开发成本相对较低

适用场景

对性能要求极高的场景,且开发团队熟悉查询引擎的开发语言

对开发语言灵活性要求高、需要调用外部服务或程序库的场景

UDF、UDAF和UDTF的对比

  • UDF:创建一个计算两个数字之和的函数。
  • UDAF:创建一个计算平均值的函数。
  • UDTF:创建一个函数,用于将一个包含多个值的字符串拆分成多行。
表3 UDF、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字段。

相关文档