代码捆绑包¶
任何合作者都可以将自定义的 Python 过程、UDFs 或 UDTFs 与协作模板捆绑在一起。模板随后会引用这些捆绑的代码,以在协作中执行复杂的数据操作。常见用途包括机器学习或在查询中进行自定义数据操作。您上传的代码可以导入和使用 经批准的 Python 包捆绑包 (https://repo.anaconda.com/pkgs/snowflake/) 和 Snowpark API 中的包。
自定义代码只能通过模板调用,不能直接调用。
备注
代码捆绑包仅支持 Python 编程语言。
以下部分向您展示如何上传和使用代码捆绑包。
实施自定义代码捆绑包¶
以下是上传和使用代码捆绑包的方法:
代码提交者:
通过调用 REGISTER_CODE_SPEC 创建并注册代码。
代码可以内联在规范中,也可以 从暂存区链接。
通过在模板的
code_specs数组中的 ID,创建一个引用代码包 规范的模板。如下例所示,将此字段添加为 template 和 parameters 字段的同级字段:注册模板,然后 将模板链接到协作中。
分析运行器:
通过调用
RUN以标准方式运行模板。
重要
在将任何上传的捆绑包部署到 Clean Room 之前,Snowflake 会对其执行安全检查。如果安全检查失败,该模板及其捆绑代码将不会被部署,也无法使用。
要确认带有代码捆绑包的模板已部署并可供使用,请执行以下步骤:
查找您尝试部署代码捆绑包的洁净室应用程序的名称:
检查 DESCRIBE APPLICATION 响应中的
upgrade_state值。当升级状态为 COMPLETE 时,表示安全检查已通过,新模板和捆绑包可供使用。使用 SQL(如下例所示)传入上一步中命令返回的应用程序名称:SQL 代码:
创建并注册代码包规范¶
上传自定义代码的第一步是创建并注册代码包规范。
自定义函数在 YAML 代码包规范中定义。每个代码包都会公开一个或多个可由模板调用的函数。代码包规范既可以包含规范中的内联代码,也可以 链接到位于 Snowflake 暂存区上的代码。
协作者通过调用 REGISTRY.REGISTER_CODE_SPEC 来注册规范,这将返回代码包 ID。
在引用代码捆绑包的模板链接到协作后,协作中任何能够访问链接该代码包的模板的人员都可以看到该代码包。调用 VIEW_CODE_SPECS 以列出协作中可访问的代码包。
协作中任何能看到代码包的人,都可以在该协作的自有模板中查看并使用它。任何内联代码都可以由协作中的任何成员查看,但协作者无法查看暂存的成品代码。协作者需要确保所引用工件的 content_hash 相匹配,以进行代码完整性验证。
以下代码包规范公开了名为 normalize_value 的单个 Python UDF,它会调用该规范中定义的 normalize 函数:
创建并注册调用模板¶
注册代码规范后,协作者将注册一个使用此代码包的模板。要使用代码包,请在模板的 code_specs 字段中添加代码包规范 ID。将此模板添加到协作中也将导致捆绑的代码在协作中可用。
模板使用语法 cleanroom.spec_name$function_name 调用自定义函数。请注意字面量 . 和 $ 名称范围标记。
备注
请使用规范名称(而不是规范 ID)来引用模板中的函数。这样您就可以快速更新代码捆绑包的版本,而无需更改模板中对该代码捆绑包的所有引用。
在以下示例中,模板使用了来自代码包 custom_udf 的函数 normalize_value:
将模板添加到协作¶
以标准方式将调用函数的模板添加到协作中。有关更多信息,请参阅 模板。
当调用模板被添加到协作时,Snowflake 会进行验证并上传到协作中。以下示例展示了向现有协作添加模板的请求:
备注
使用代码捆绑包安装模板会触发 Snowflake 安全检查,并发布底层 Clean Room 的新补丁。在此过程完成且补丁安装成功之前,该模板将不可用、也无法使用。
要查看补丁安装进度,请执行以下步骤:
查找 Clean Room 应用程序的名称。通常,该名称会是
SFDCR_<clean room name>,但您可以通过搜索来确认:检查补丁安装的状态。在以下查询中等待
upgrade_state变为 COMPLETE:
代码版本管理¶
在账户的所有注册表中,每个注册的代码规范必须具有唯一的名称 + 版本。模板会加载特定名称和版本的代码规范。如果要创建或使用新版本的代码,则必须提交新版本的模板,并在 code_specs 字段中引用新的代码版本。您不需要更改模板正文。例如:
第 1 步: 使用代码包的版本 1:
第 2 步: 更新并注册代码包的新版本,然后更新模板以使用新版本:
请注意,函数名称不包含版本,因此在上传函数的新版本时,无需更改模板正文中的调用代码。
示例规范¶
带有代码正文的内联 UDF¶
一个带有内联 Python 代码的简单 UDF:
UDTF(用户定义的表函数)¶
此示例 YAML 定义了一个返回多行的 UDTF:
带有 wheel 包的暂存工件¶
请务必阅读 stage_path 文档要求,了解如何在代码规范中链接到暂存代码。
此示例 YAML 使用暂存的 Python wheel 包:
存储过程¶
此示例 YAML 定义了用于数据处理的存储过程:
作为暂存工件的多个 Python 文件¶
请务必阅读 stage_path 文档要求,了解如何在代码规范中链接到暂存代码。
此示例 YAML 使用多个暂存的 Python 源文件: