手记

从 Glue 到 Snowpark 的旅程…

声明:我是一名 Snowflake 首席解决方案架构师 。以下观点仅代表个人立场,不代表我现任、前任或未来雇主的观点

最近我发现需要将一些代码从Amazon Glue脚本移植到Snowpark。

我特别兴奋地看到这篇关于使用SMA和一些AWS Glue示例的文章(https://medium.com/snowflake/snowpark-migration-accelerator-the-ultimate-solution-to-all-your-spark-to-snowflake-migration-woes-aa91ca628faf),所以我想试一试

一部分代码用 DataFrame API 来执行任务,而另一部分代码则主要依赖 Glue 的特定功能。

我希望让迁移体验更简单。所以我决定创建一些小工具,这样我们就可以快速将相关逻辑迁移到Snowpark。

瑞典SF Jobs的小帮手们介绍

这些助手的代码可以在snowpark_extensions代码库的extras文件夹中找到。

我创建了SF Jobs作为一些兼容性辅助工具来帮助AWS胶水代码。它们几乎可以作为即插即用的替代品,因此除了调整一些导入项外,您的代码几乎保持不变。

有些考虑因素。

  • Glue 有一个 DynamicFrames 概念。对于这个库,DynamicFrames 将映射到 Snowpark DataFrames。在加载数据时,例如当你加载一个 CSV 文件时,会使用 Snowpark 的 infer_schema 能力(见示例 #12),在这种情况下,会将列转换为字符串,使用 VARIANT 能力来模仿 DynamicFrames 的方式。
  • Glue 的转换是通过 Snowpark DataFrame 构造完成的,辅助工具只是允许你保持 Glue 的语法不变。
  • 大小写敏感性是一个重要的主题。在 Snowflake 中,元数据存储为大写形式,除非被引用,Snowflake 在执行时会将标识符转换为大写。添加了一些扩展,允许指定小写的列,并在启用时,辅助工具会在启用时进行不区分大小写的搜索。类似于 id 的引号只是在执行前转换为 "id" 格式。
  • 大量的 Glue 操作直接针对 S3 桶进行。你可以在 Snowflake 上做很多相同的操作,但你可能可以考虑使用 Snowflake 表或 Iceberg 表 作为更好的替代方案。在我的例子中,我构建了一个 S3 集成,它给我对那个 S3 桶及其下方任何前缀的完全访问权限,这使得执行类似的 Glue 操作更加有意义。
  • 我认为这个库是快速在 Snowflake 上运行代码的好途径,但强烈建议考虑 Snowflake 的一些原生选项,如 auto_ingest snowpipes触发任务动态表
现在让我们看看实际操作吧

以我的例子来说,我将使用一个笔记本。我真的很喜欢这个notebook功能 :)

让笔记本准备好

首先,创建你的笔记本。

新建一个记事本

指定笔记本名、位置和仓库

在开始之前,让我们确认一下我们手头的参考资料是否齐全。

在Anaconda中添加pandassnowflake-snowpark-python

添加Anaconda包

我们现在来添加我们的sfjobs库。这个库没有包含在Anaconda里,因此我们需要先构建它,然后再添加进来。

下载代码后,请进入该 glue_helper 文件夹,运行 snow-cli 命令进行构建。

或者您也可以从GitHub Releases下载它。

去你的数据库里找到这个阶段

接着点击上传文件按钮:

选择 sfjobs.zip 文件:

上传文件后,回到您的笔记本页面,在“包”选项中添加 sfjobs.zip 文件,并根据您的阶段名称调整文件的位置。

导入

先删掉预设的示例单元格,然后我们从一个 Python 单元格开始导入一些所需的库。

这些导入只是获取一些在特定上下文中的命令。

如你所见,这些导入故意与旧的glue模块导入类似。
我们还创建一个新的会话,并在需要时获取所需的函数和类型。

获取点数据

使用之前创建的S3集成,我设置了一个加载阶段。

这只是暂时的,因为我只会在这本笔记本里用到它。

让我们加载医保数据集。

我建议在第4行执行这个步骤,只是为了保证所有列都变为大写,这会更方便些。

正如您所见,PROVIDER ID 字段被加载为字符串,因为在该 glue 示例中添加了一些数据以展示该列包含整数和字符串数据。

让我们把它存到表格里吧。

我们可以使用类似的 API 函数来加载数据,例如使用 DynamicFrame(动态帧)类似的方法。

如前所述,DynamicFrames(动态框架)在此实现中仅仅是 DataFrames,这里只显示了一种数据类型,但我们仍然可以进行一些“动态”类型的管理。

化解冲突

通常我们会用 resolveChoice 来尝试解决数据一致性问题。

使用“解决选项”可以移除这两个异常记录,我们可以看到resolveChoice能处理这两个异常。

使用 case_insensitive 匹配和 自定义函数

现在让我们启用不区分大小写的解析功能,并应用一个用户定义的函数(UDF)。Snowpark对UDF的支持几乎与你在Glue中看到的一样,只需记住要指定input_typesreturn_type

列: 重命名和嵌套层级

关于重命名和嵌套列的问题,我们能否执行这些熟悉的相同操作?

将数据写回 S3

当然可以这样做。

请注意额外的 storage_integration 参数。不过你可能考虑直接保存到 Snowflake 表中,或者使用 iceberg 表,如果你仍然希望数据存储在 S3 中

更多的选择,例如 make_cols 或 make_struct?

最后的感想

谢谢您看到这里。本指南的目的是展示Snowpark支持的强大功能。

当你有了从glue到snowpark的等效的笔记本后,你可以轻松地创建一个计划表并让它运行起来:

希望你发现这些内容既实用又有启发性,一如既往地觉得它们对你有所帮助。

0人推荐
随时随地看视频
慕课网APP