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

直接使用已注册的UDAF

当UDAF已由其他用户或脚本注册到数据库后,可以通过udaf.get获取已注册的UDAF算子,并在aggregate中直接调用,无需重复注册。

场景描述

在团队协作中,UDAF的注册和使用往往是分离的。本示例展示如何查看数据库中已注册的UDF列表,获取已注册的UDAF算子 pythontopk,并在 category_sales 表上按 category 分组聚合,取每组 amount 最高的前3个值。

约束与限制

  • 使用前需确保目标UDAF已注册到指定数据库中,函数名在数据库中存储为全小写。
  • UDAF通过 AggregateFnBuilder 构建聚合表达式,__init__参数通过 constructor_kwargs 传入。

前提条件

  • 已创建表并写入数据。具体操作,请参见创建表并写入数据。
  • 运行时环境要求Python版本为3.11。

示例

本示例展示如何查看数据库中已注册的UDF列表,获取已注册的UDAF算子pythontopk,并在category_sales表上按商品类别分组聚合,取每组金额前3的记录。

  1. 连接Aura服务并设置UDF工作空间。
  2. 查看目标数据库中已注册的UDF名称列表。
  3. 若pythontopk存在,获取该UDAF算子。
  4. 加载category_sales数据集。
  5. 通过AggregateFnBuilder构建聚合表达式,按category分组取amount前3。
  6. 执行聚合查询并打印结果。
  7. 关闭Aura连接。
import os
from aura_frame.multimodal import ai_lake
from aura_frame.multimodal.function import AggregateFnBuilder

target_database = "test"  #在LakeFormation中创建数据库,例如:test。具体操作,请参见创建LakeFormation实例并规划元数据
#连接AuraJobV2端点,具体参数说明,请参见建立与AuraJobV2端点的连接。
con = ai_lake.connect(
    aura_endpoint=os.getenv("aura_endpoint"),         # AuraJobV2端点所在的终端节点(Endpoint)
    aura_endpoint_id=os.getenv("aura_endpoint_id"),    # AuraJobV2端点ID
    aura_endpoint_name=os.getenv("aura_endpoint_name"),# AuraJobV2端点名称
    aura_workspace_id=os.getenv("aura_workspace_id"),  # 工作空间ID
    lf_catalog_name=os.getenv("lf_catalog_name"),      # LakeFormation Catalog名称
    access_key=os.getenv("access_key"),                # 访问密钥ID(AK)
    secret_key=os.getenv("secret_key"),                # 访问密钥(SK)
    default_database=target_database,                       # LakeFormation数据库名称
    use_single_cn_mode=True,   # 是否开启单CN模式
    logging_level=logging.INFO # 设置日志级别
)
#配置UDF部署工作区,具体参数说明,请参见配置UDF部署工作区。
con.set_function_staging_workspace(
    obs_directory_base=os.getenv("obs_directory_base"),  # 并行文件系统中UDF的存储路径
    obs_bucket_name=os.getenv("obs_bucket_name"),        # 并行文件系统名称
    obs_server=os.getenv("obs_server"),                  # OBS终端节点(Endpoint)
    access_key=os.getenv("access_key"),                  # 访问密钥ID(AK)
    secret_key=os.getenv("secret_key"),                  # 访问密钥(SK)
)
try:
    # 查看已注册的所有UDF名称
    udf_names = con._conn.udaf.names(database=target_database)
    print(f"已注册的UDF: {udf_names}")
    if "pythontopk" in udf_names:
        # 获取已注册的UDAF算子
        topk_udaf = con._conn.udaf.get(name="pythontopk", database=target_database)
        ds = con.load_dataset("category_sales", database=target_database)
        # 在aggregate中使用,通过constructor_kwargs传入__init__参数
        udaf_builder = AggregateFnBuilder(
            fn=topk_udaf, on=[ds.amount], as_col="top3",
            constructor_kwargs={"k": 3},
        )
        summary = ds.aggregate([udaf_builder], by=[ds.category])
        df = summary.execute()
        print(df)
finally:
    con.close()

相关文档