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

signature说明

signature用于描述UDF的函数签名,即函数的输入参数和返回值的类型信息。它由Parameter 列表 + return_annotation组成,注册函数时被写入LakeFormation元数据,供引擎调用时进行参数与类型的匹配。

signature参数说明

signature对象由Parameter列表与return_annotation组成。

表1 属性说明

属性

类型

说明

name

str

参数名。

kind

ParameterKind

参数类别:POSITIONAL_ONLY/POSITIONAL_OR_KEYWORD/KEYWORD_ONLY/VAR_POSITIONAL/VAR_KEYWORD。

default

Any

默认值;无默认值时为EMPTY。

annotation

Any

类型注解;无注解时为EMPTY。

什么情况下使用

场景

推荐做法

UDF有完整、准确的类型注解

传signature=None,交由SDK自动推断。

UDF注解与实际期望签名不一致,或需覆盖

显式传入Signature对象。

批量模式下需要使用元素类型作为签名

显式传入带元素类型的Signature,SDK据此映射Lakeformation列类型。

自动推断规则(signature=None时)

当signature未显式传入(为 None)时,SDK依据UDF的代码形态与类型注解自动推断函数签名,无需手动构造Signature对象。推断失败时抛出SignatureInferenceError。

语法示例:

为UDF标注参数与返回值的类型注解,即可触发自动推断。

# 带类型注解的 UDF(推荐写法)
def to_celsius(fahrenheit: float) -> float:
    return (fahrenheit - 32) * 5 / 9

# signature=None 时,SDK 自动推断出等价签名:
#   signature = [Parameter(name="fahrenheit", kind=POSITIONAL_OR_KEYWORD, default=EMPTY, annotation=float)]
#   return_annotation = float
client.create_udf(to_celsius, name="to_celsius")

推断规则:

UDF 形式

推断行为

普通函数

使用inspect.signature + get_type_hints读取参数与返回注解。

类定义形式UDF

检查类中的__call__方法,读取其注解;若类无自定义__call__,抛出SignatureInferenceError。

类实例形式UDF

检查实例所属类的__call__方法;实例本身已通过cloudpickle序列化,class_name取自 type(udf).__name__。

绑定方法

自动解包为普通函数推断。

  • 所有参数必须带类型注解;FunctionSignature.from_signature 会对无注解参数抛出ValueError。
  • 裸容器类型(如list、dict而无元素类型)不被接受,须使用 list[T]、dict[K, V]等带元素类型的注解。
  • 若signature为None且推断失败(例如函数无类型注解、类无 __call__),SDK会抛出SignatureInferenceError。

批量模式(is_batch=True)下的signature要求

批量模式(is_batch=True)下,UDF一次性处理一批数据而非单行数据,因此signature的参数注解必须使用批量类型(pyarrow或pandas的数组/表结构),且所有参数的批量类型必须一致,以匹配引擎的批量传参方式。

语法示例

使用批量类型注解定义批量UDF,并注册时开启 is_batch。

import pyarrow as pa

def double_batch(values: pa.Array) -> pa.Array:
    return pa.array([v * 2 for v in values])

client.create_udf(double_batch, name="double_batch", is_batch=True, batch_size=1024)

批量类型对照

批量类型

检测到的input_type

pyarrow.Array/pyarrow.Table

pyarrow

pandas.Series/pandas.DataFrame

pandas

  • 若signature由注解自动推断且参数为非批量元素类型,SDK抛ValueError。
  • 若显式传入signature使用元素类型,SDK会改从UDF自身注解推断input_type。
  • 建议使用 list[T] 携带元素类型信息,便于LakeFormation存储列原始数据类型;裸pyarrow.Array、pandas.Series不携带元素类型时会在from_signature阶段报错。

相关文档