更新时间:2026-10-16 GMT+08:00
分享

创建UDAF

将一个聚合函数(UDAF)注册到LakeFormation。聚合函数对多行数据进行聚合计算。除udf_type固定为udaf外,参数与create_udf完全一致。

前提条件

  • 已完成SDK安装。具体操作,请参见Catalog SDK获取与安装。
  • 已准备好UDF可调用对象(函数、函数类或类实例),并标注了类型注解。

函数签名

client.create_udaf(
    udaf, /, *,
    database=None,
    name,
    signature=None,
    imports=None,
    runtime_env=None,
    description=None,
    pretty_name=None,
    is_strict=True,
    volatility="VOLATILE",
    is_batch=False,
    batch_size=None,
    cpu_arch=None,
    cpus=None,
    memory=None,
    device_type=None,
    devices=None,
) -> Function

参数说明

参数

是否必选

类型

默认值

说明

udaf

是

Any(位置参数)

-

udaf可调用对象(函数或可调用类)。

database

否

str | None

default_database

目标数据库名;为None时使用客户端默认数据库。

name

是

str

-

函数名,须以字母开头,仅含字母/数字/下划线,长度 3–128。

signature

否

Signature | None

None

显式函数签名;为None时由UDF注解自动推断。

关于signature的更多信息,请参见signature说明。

imports

否

str | Iterable[str] | None

None

需要打入UDF包的文件/目录路径或URL列表。

runtime_env

否

str | Mapping | None

None

运行时环境配置(python_version、pypi 依赖等),可传 JSON 字符串或字典。

关于runtime_env的更多信息,请参见runtime_env说明。

description

否

str | None

None

函数描述。

pretty_name

否

str | None

None

展示名;为None时使用name。

is_strict

否

bool

True

函数是否严格(输入为NULL时是否直接返回NULL)。

volatility

否

str

“VOLATILE”

函数易变性:IMMUTABLE/STABLE/VOLATILE。

is_batch

否

bool

False

是否启用批量处理模式。

batch_size

否

int | None

None

批量处理每批大小;is_batch=True 时建议提供,须为正整数。

cpu_arch

否

str | None

None

CPU架构,取值arm或x86。

cpus

否

float | None

None

CPU核数,最小0.33。

memory

否

int | None

None

内存大小,单位MB,最小1。

device_type

否

str | None

None

设备类型,例如npu、gpu。

devices

否

float | None

None

设备数量,需为正数。

返回值

返回Function对象。

示例代码

class WeightedSum:
    """UDAF:加权求和 sum(value * weight)。

    accumulate 逐行累积中间态(sum_vw),merge 合并分区,
    finish 返回最终聚合结果。
    """

    def __init__(self):
        self._agg_state = 0.0

    @property
    def aggregate_state(self) -> float:
        return self._agg_state
    def accumulate(self, value: int, weight: int) -> None:
        """逐行累积:value * weight 求和"""
        if value is not None and weight is not None:
            self._agg_state += value * weight
    def merge(self, other_state: float) -> None:
        """合并其他分区的中间态"""
        self._agg_state += other_state
    def finish(self) -> float:
        """返回最终聚合结果"""
        return self._agg_state

func = client.create_agg_function(
    WeightedSum,
    database=database,
    name="weighted_sum_udaf",
    signature=sig,
    comment="UDAF: 加权求和 sum(value * weight)",
)

相关文档