C/C++教程

用Snowpark解决Advent of Code编程挑战(第一部分)

本文主要是介绍用Snowpark解决Advent of Code编程挑战(第一部分),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
搭建环境

这张照片由 Marina Dina 拍摄,来自 Unsplash(unsplash.com)

到了十二月,成千上万的开发者报名参加AoC,这是一系列每日一题的编程谜题,你可以用你选择的任何编程语言来解决。这是一个有趣的方式来提升或复习你的编程技能,或者了解一门新的编程语言。

以前,我用 SQL 和 PL/SQL 代码实现了 Advent of Code,然后改用 Python,而今年,我打算用 Snowpark 来挑战自己。Snowpark 是一组运行在 Snowflake(AI 数据云)上的库和代码执行环境,可以用来运行 Python。

在这一年的Advent of Code期间,我将撰写教程,介绍解谜的过程。我不能承诺每个谜题都会写教程,因为我还有自己的生活需要照顾,特别是在忙碌的假期。不过,我会尽可能在我的教程中介绍Snowpark的各种功能。

在2024年Advent of Code正式开始之前(12月1日午夜,即UTC-5时区的12月1日午夜),我们将从设置开发环境开始(本文将介绍)。在接下来的文章里,我们将通过解决去年挑战中的一个谜题来预热,以便您大致了解Snowpark是如何工作的。

搭建您的Snowflake环境配置

让我们从显而易见的开始。你需要一个Snowflake账户才能使用Snowpark。你可以在这里(点击链接)注册一个免费试用,或者如果你已经有Snowflake账户的话,就直接使用它。

一旦我们获得了Snowflake账号的访问权限,我们就可以配置几个组件:一个数据库,一个模式,一个虚拟仓库,以及一个可以操作的角色。

登录到您的 Snowflake 账户后,打开一个 SQL 工作表页面。首先,您需要创建一个名为 AOC_DEVELOPER 的角色,并将该角色赋予您的用户名,这样您就可以使用该角色了:

    -- 创建一个角色  
    use role useradmin;  -- 注:useradmin 是一个管理用户的角色  
    create role aoc_developer;  
    grant role aoc_developer to user <your username>;

然后创建名为 AOC2024_DB 的数据库,名为 AOC 的模式,创建名为 AOC_WH 的虚拟仓库并使用默认参数,授予 AOC_DEVELOPER 角色使用数据库和仓库的权限,以及模式的所有权限(因此 AOC_DEVELOPER 角色将能够在此模式中能够创建和管理所有类型的 Snowflake 对象)。

    -- 创建一个数据库、一个架构和一个虚拟仓库(V warehouse)  
    切换到sysadmin角色;  
    create database aoc2024_db;  
    create schema aoc;  
    create warehouse aoc_wh;  
    -- 将数据库、架构和虚拟仓库的使用权限授予aoc_developer角色  
    grant usage on database aoc2024_db to role aoc_developer;  
    将架构aoc的所有权限授予aoc_developer角色;  
    将aoc_wh虚拟仓库的使用权限授予aoc_developer角色;
搭建开发环境

你也需要 Python。撰写本文时,Python 的最新支持版本是 3.11(你可以在 Snowflake 文档 这里 查看到支持的 Python 版本)。为了使用 Snowpark,如果没有安装 Python 3.11,请安装这个版本。

你可以使用你喜欢的任何集成开发环境(IDE)。我将使用 Visual Studio Code,所以我将使用它。接着创建一个 Python 虚拟环境。如果你使用的是 conda,你可以用它来创建虚拟环境。我将使用 virtualenv

    python -m venv .venv

(该命令用于创建一个虚拟环境)

然后将此环境中的Python可执行文件设置为IDE中的Python解释器。在Visual Studio Code中,可以通过命令面板选择它。

在安装Snowpark库之前,请先检查您在Snowflake账户中的snowflake-snowpark-python库的最新版本。在Snowflake的工作表中输入以下命令:

    查询版本  
    在 information_schema.packages 中  
    其中 语言 = 'python'  
    并且 运行时版本 = '3.11' -- 你的 Python 版本  
    并且 包名 = 'snowflake-snowpark-python';

查找我Snowflake账户中的最新版本,版本号为1.24.0。使用_conda_或pip(我这里用的是pip)安装这个版本的Snowpark库。

    pip install snowflake-snowpark-python[pandas]==1.24.0
使用pip安装snowflake-snowpark-python[pandas]==1.24.0

[pandas] 这个依赖是可选的,仅当你需要处理 Pandas 数据框时才需要。我们先安装一下吧,以防万一,因为今年的谜题还没公布,但可能会发现它很有用。

设置你的 Python 连接环境

接下来,你需要设置连接参数以便你可以从 Python 连接到 Snowflake。我建议使用密钥对认证(或者如果你使用的是 Snowflake 试用账号,你也可以仅使用用户名和密码,但既然这是一个 Snowpark 教程,你应该学会如何配置密钥对认证,以备将来使用)。

对于密钥对身份验证,您需要一个公钥和一个私钥。您可以使用 openssl 命令通过命令生成这些密钥,操作指南可以在 Snowflake 文档中找到 此处。为了简化,生成未加密的私钥并不使用密码。

一旦你获得密钥,回到一个Snowflake工作表,并将公钥分配给你的用户名(替换为你实际的以MII开头的公钥),如下所示:

    -- 将你的公钥与用户名关联起来
    use role accountadmin;
    alter user 你的用户名 set rsa_public_key = 'MII...';

设置连接到 Snowflake 的参数时,可以使用多种方式,例如通过环境变量等方式提供参数,也可以通过 JSON 对象或 .env 文件等方式。在本教程中,我们将使用 connections.toml 文件来设置连接参数。

进入你的主文件夹(~),并创建一个 .snowflake 文件夹(如果你之前使用过 Snowflake CLI 或 Visual Studio Code 的 Snowflake 插件,你可能已经创建过这个文件夹)。在 .snowflake 文件夹中(即 ~ 目录下的),如果还没有 connections.toml 文件,请创建一个名为 connections.toml 的文件(如果还没有的话)。

更多关于 connections.toml 文件的信息,可以在 Snowflake 文档 here 中找到。

添加一个名为 aoc_connection 的连接项,并设置参数,如雪flake账号名、用户名、私钥文件路径、角色、虚拟仓库、数据库和模式。使用密钥对认证时,请将认证器设置为 SNOWFLAKE_JWT(如果只使用用户名和密码进行登录,则跳过 authenticatorprivate_key_file 参数,改为添加密码参数)。

以下是从 connections.toml 文件中提取的信息:

    [aoc_connection]  
    account = "<你的 Snowflake 帐户>"  
    user = "<你的用户名>"  
    authenticator = "SNOWFLAKE_JWT" 保留原样  
    private_key_file = "<私钥文件路径>"  
    role = "AOC_DEVELOPER" 保持原样  
    warehouse = "AOC_WH" 保持原样  
    database = "AOC2024_DB" 保持原样  
    schema = "AOC" 保持原样

在IDE中新建Python文件,然后从snowflake.snowpark导入Session。使用Session.builder.config方法,将之前配置的“aoc_connection”作为参数传递。以下是用于创建Snowflake连接的Python代码:

    from snowflake.snowpark import Session  

    # 创建会话  
    session = Session.builder.config("connection_name", "aoc_connection").create()

当你执行这段代码时,如果你正确配置了所有设置,它应该能够正常运行(不会抛出错误)。不过,这段代码目前还没有任何实际作用,你可以通过添加一条 SQL 语句来测试它是否工作正常。例如,你可以添加以下 SQL 语句来检索并打印当前用户:

SELECT CURRENT_USER;
打印(session.sql('select current_user()').collect())

打印当前用户的会话信息:这段代码用于获取并打印当前用户的会话信息。

输出应该像这样:

[Row(CURRENT_USER()='<你的用户名这里填写>')]

如果你做到了这里,恭喜你!你的Snowpark环境已经准备好啦。敬请关注系列文章的下一篇,我们将会解决去年挑战中的一个谜题哦。

我是马雅 Ferle,Snowflake 数据大师,同时也是 In516ht 的高级顾问。你可以通过 LinkedIn 联系我,也可以在我的新书《Snowflake 数据工程》中了解更多信息。

这篇关于用Snowpark解决Advent of Code编程挑战(第一部分)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!