從 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中添加pandas和snowflake-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能处理这两个异常。
现在让我们启用不区分大小写的解析功能,并应用一个用户定义的函数(UDF)。Snowpark对UDF的支持几乎与你在Glue中看到的一样,只需记住要指定input_types和return_type。
关于重命名和嵌套列的问题,我们能否执行这些熟悉的相同操作?
当然可以这样做。
更多的选择,例如 make_cols 或 make_struct?请注意额外的
storage_integration参数。不过你可能考虑直接保存到 Snowflake 表中,或者使用 iceberg 表,如果你仍然希望数据存储在 S3 中
谢谢您看到这里。本指南的目的是展示Snowpark支持的强大功能。
当你有了从glue到snowpark的等效的笔记本后,你可以轻松地创建一个计划表并让它运行起来:
希望你发现这些内容既实用又有启发性,一如既往地觉得它们对你有所帮助。
共同學(xué)習(xí),寫下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章





















