# 开发注意事项
#### 运行环境约束
- UDF编程语言仅支持Python。
- UDF运行时环境的Python版本支持3.10和3.11系列，建议使用3.11.9版本。
- 使用CLOUDPICKLE序列化主函数时，确保本地Python版本为3.11.9且cloudpickle版本为 3.0.0，以避免Aura运行环境里因版本不一致导致函数体解析失败。
 
#### 函数定义约束
- UDF 的参数不支持设置默认值；如果创建函数时参数或返回值带有精度，不进行精度检测。
- 不支持函数重载。
 
#### 函数与代码包要求
- 函数体和代码包归档路径，两者必须定义一个。
- 当业务场景比较复杂、UDF所涉及的代码较多时，推荐以文件压缩包形式注册函数：将UDF依赖的所有相关代码文件统一归档到一个压缩包，上传至OBS后，在创建函数时指定压缩包的存储路径。压缩包要求如下：
  - 必须包含文件 {FUNCTION_NAME}_source.py，该文件被视为函数的主入口文件，且内容需使用CLOUDPICKLE序列化为十六进制。
  
  - 主函数需要import的模块所属的代码文件，需要正确组织结构。
  
  - 压缩包格式仅支持zip。 压缩包示例如下：
    ```
    my_udf.zip/
    ├── my_udf_source.py
    ├── my_helper.py
    └── other/
            └── utils.py
    ```
    
   
 
#### 注册方式的建议
Aura提供了三种注册UDF的方式：[ibis-aura SDK显式注册、隐式注册](https://support.huaweicloud.com/sdkreference-aidatalake/aidatalake_061_0104.html#aidatalake_061_0104__zh-cn_topic_0000002530001292_section9860366564)以及[SQL的DDL注册](https://support.huaweicloud.com/sqlref-aura-aidatalake/aidatalake_061_0221.html)，推荐用户使用ibis-aura SDK显式注册，该方式有以下两个优势：
- SDK提供的注册接口已完全遵守Aura DDL的使用规范，只要正确调用接口即可，能避免违反约束规范而导致UDF不能正常使用的问题。
- SDK提供了更多的约束检查，例如Python版本的检测，自动整理UDF代码包等。
 
#### 依赖管理
- Python UDF 的三方依赖包列表需要保证lib间的兼容性，并建议所有依赖包指定稳定的版本。
- 在本地调试UDF时，建议使用华为源所提供的三方包搭建调试环境，以避免UDF代码在本地环境可运行，而在Aura里运行时出现版本无法安装、版本不兼容等问题。
 
#### 存储与权限
用户只能使用OBS并行文件系统的桶，来存储UDF代码压缩包，且需要在LakeFormation上赋予IAM用户读的权限。
