# 创建UDF
将一个UDF（逐行处理输入列、返回单值）注册到LakeFormation。注册流程：类型推断-\>打包-\>上传OBS-\>写入LakeFormation元数据。若LakeFormation注册失败，会自动回滚已上传的OBS包。
#### 前提条件
- 已完成SDK安装。具体操作，请参见[Catalog SDK获取与安装](https://support.huaweicloud.com/sdkreference-aidatalake/aidatalake_09_0010.html)。
- 已准备好UDF可调用对象（函数、函数类或类实例），并标注了类型注解。
 
#### 函数签名
```
client.create_udf(
    udf, /, *,
    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
```
#### 参数说明
| 参数          | 是否必选 | 类型                             | 默认值              | 说明                                                                                                                                                                                                                                      |
|:---|:---|:---|:---|:---|
| udf         | 是    | Any（位置参数）                      | -             | UDF可调用对象（函数或可调用类）。                                                                                                                                                                                                                      |
| database    | 否    | str \| None                    | default_database | 目标数据库名；为None时使用客户端默认数据库。                                                                                                                                                                                                                |
| name        | 是    | str                            | -                | 函数名，须以字母开头，仅含字母、数字、下划线，长度为3\~128。                                                                                                                                                                                                       |
| signature   | 否    | Signature \| None              | None             | 显式函数签名；为None时由UDF注解自动推断。 关于signature的更多信息，请参见[signature说明](https://support.huaweicloud.com/sdkreference-aidatalake/aidatalake_09_0021.html)。                          |
| imports     | 否    | str \| Iterable\[str\] \| None | None             | 需要打入UDF包的文件/目录路径或URL列表。                                                                                                                                                                                                                 |
| runtime_env | 否    | str \| Mapping \| None         | None             | 运行时环境配置（python_version、pypi依赖等），可传JSON字符串或字典。 关于runtime_env的更多信息，请参见[runtime_env说明](https://support.huaweicloud.com/sdkreference-aidatalake/aidatalake_09_0022.html)。 |
| 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对象，其中包含LakeFormation分配的version_id、resource_uris（OBS包地址）及parameters（签名、运行时环境等元数据）。
#### 示例代码
![](https://support.huaweicloud.com/sdkreference-aidatalake/public_sys-resources/note_3.0-zh-cn.png)
- 若未提供signature，SDK会通过infer_signature从UDF的类型注解推断签名。类形式UDF取其__call__ 方法。
- 类定义形式UDF会抽取构造函数定义（ConstructorDef）并记录class_name，便于Aura引擎定位类。
- 类实例形式UDF通过cloudpickle序列化实例，class_name取自实例类型。
 
```
# 1. 定义带类型注解的UDF
def to_celsius(fahrenheit: float) -> float:
    return (fahrenheit - 32.0) * 5.0 / 9.0
# 2. 注册到LakeFormation
func = client.create_udf(
    udf=to_celsius,
    name="to_celsius",
    description="华氏度转摄氏度",
    runtime_env={"python_version": "3.11", "pypi": []},
)
print(f"Registered: {func.function_name}, version={func.version_id}")
```
