使用 Snowpark Python 加载和查询示例数据

简介

本教程使用一个名为 Tasty Bytes 的虚构食品卡车品牌来向您展示如何使用 Snowpark Python 在 Snowflake 中加载和查询数据。您将使用 Snowsight 中预加载的 Python 工作表来完成这些任务。

下图提供了 Tasty Bytes 的概述。

包含 Tasty Bytes 的概述,该公司是一个全球食品卡车网络,拥有 15 个品牌的本地化食品卡车选项,可供多个国家和城市选择。该图像描述了公司的使命、愿景、所在位置、当前状态和未来目标。

备注

Snowflake 对本教程中示例数据使用的磁盘存储收取最低费用。本教程提供删除数据库并最大程度地降低存储成本的步骤。

Snowflake 需要一个 虚拟仓库 加载数据并执行查询。正在运行的虚拟仓库会使用 Snowflake Credit。在本教程中,您将使用 30 天试用账户 (https://signup.snowflake.com/),该账户提供免费 Credit,您无需支付任何费用。

您将学习的内容

在本教程中,您将学习如何使用 Snowpark Python API 完成以下任务:

  • 创建数据库和架构。

  • 创建一个在 Amazon S3 桶中保存数据的暂存区。

  • 创建 DataFrame,指定作为数据源的暂存区。

  • 创建一个包含暂存区文件数据的表。

  • 设置 DataFrame 以查询新表并筛选数据。

先决条件

本教程假定满足以下条件:

  • 您拥有 支持的浏览器

  • 您拥有试用账户。如果您还没有试用账户,可以注册一个 免费试用账户 (https://signup.snowflake.com/)。您可以选择任意 Snowflake 云区域

  • 您的用户是账户管理员,并被授予 ACCOUNTADMIN 系统角色。有关更多信息,请参阅 使用 ACCOUNTADMIN 角色

备注

本教程仅适用于拥有试用账户的用户。示例工作表不适用于其他类型的账户。

第 1 步:使用 Snowsight 登录

要通过公共互联网访问 Snowsight,请执行以下操作:

  1. 在支持的 Web 浏览器中,导航至 https://app.snowflake.cn

  2. 提供 账户标识符 或账户 URL。如果您之前登录过 Snowsight,可能会看到一个可以选择的账户名称。

  3. 使用 Snowflake 账户凭据登录。

第 2 步:打开 Python 工作表

您可以使用 Python 工作表来编写和运行 Python 代码。您的试用账户有权访问本教程的预加载 Python 工作表。该工作表具有 Python 代码,可运行以创建数据库、加载数据至数据库和查询数据。有关 Python 工作表的更多信息,请参阅 在 Python 工作表中编写 Snowpark 代码

要打开预加载的 Python 工作表教程,请执行以下操作:

  1. 选择 Projects » Worksheets 以打开工作表列表。

  2. 打开 [Tutorial] Using Python to load and query sample data

    您的工作表看起来类似于下图。

Python 会加载和查询工作表,其中包含本教程的代码以及描述性注释。

这个预加载的 Python 工作表会自动使用 ACCOUNTADMIN 系统角色,以便查看和管理账户中的对象。有关更多信息,请参阅 使用 ACCOUNTADMIN 角色

工作表还使用了 COMPUTE_WH 虚拟仓库。仓库提供创建和管理对象以及运行 SQL 命令所需的资源。这些资源包括 CPU、内存和临时存储。有关更多信息,请参阅 虚拟仓库

第 3 步:学习如何使用 Python 工作表

Python 工作表让您在 Snowsight 中使用 Snowpark Python 来运行 SQL 语句。本教程的这一步描述了 Python 工作表中每个步骤的代码。使用 Python 工作表时,不能单独运行单个代码块。您必须运行整个工作表。在工作表中选择 Run 之前,请回顾以下步骤,以便更好地理解 Python 代码。

  1. 在打开的 Python 工作表中,该步骤包括以下代码:

    import snowflake.snowpark as snowpark
    from snowflake.snowpark.functions import col
    from snowflake.snowpark.types import StructField, StructType, IntegerType, StringType, VariantType
    
    Copy

    本教程会导入 snowpark 包以及选定的类和函数,以便您的代码使用它们。

  2. 工作表中的此步骤包括以下代码:

    def main(session: snowpark.Session):
    
    Copy

    这一行定义了默认的 main 处理程序函数。处理程序函数包含您将在本教程中运行的代码。这一行会传递 Session 对象,您可以用它在 Snowflake 中执行 SQL 语句。

    # Use SQL to create our Tasty Bytes Database
    session.sql('CREATE OR REPLACE DATABASE tasty_bytes_sample_data;').collect()
    
    Copy

    此行将创建一个名为 tasty_bytes_sample_data 的数据库。该数据库将数据存储在表格中,您可以对其进行管理和查询。有关更多信息,请参阅 数据库、表和视图 – 概览

    代码使用 `sql<https://docs.snowflake.com/en/developer-guide/snowpark/reference/python/latest/api/snowflake.snowpark.Session.sql>`_ 方法创建表示 SQL 语句结果的 DataFrame。在 Snowpark 中,您可以使用 DataFrame 查询和处理数据。代码还使用 收集 方法运行 DataFrame 所代表的 SQL 语句。工作表中此步骤的其他代码行也使用了这些方法。

    # Use SQL to create our Raw POS (Point-of-Sale) Schema
    session.sql('CREATE OR REPLACE SCHEMA tasty_bytes_sample_data.raw_pos;').collect()
    
    Copy

    此行将在 tasty_bytes_sample_data 数据库中创建名为 raw_pos 的架构。架构是数据库对象(如表和视图)的逻辑分组。例如,架构可能包含特定应用程序所需的数据库对象。

    # Use SQL to create our Blob Stage
    session.sql('CREATE OR REPLACE STAGE tasty_bytes_sample_data.public.blob_stage url = "s3://sfquickstarts/tastybytes/" file_format = (type = csv);').collect()
    
    Copy

    此行创建了一个名为 blob_stage 的暂存区。暂存区是保存要加载到 Snowflake 数据库的数据文件的位置。本教程会创建一个从 Amazon S3 桶加载数据的暂存区。本教程使用的是一个现有的桶,其中有包含数据的 CSV 文件。它会将 CSV 文件中的数据加载到本教程稍后创建的表中。有关更多信息,请参阅 从 Amazon S3 批量加载

  3. 工作表中的此步骤包括以下代码:

    # Define our Menu Schema
    menu_schema = StructType([StructField("menu_id",IntegerType()),\
                         StructField("menu_type_id",IntegerType()),\
                         StructField("menu_type",StringType()),\
                         StructField("truck_brand_name",StringType()),\
                         StructField("menu_item_id",IntegerType()),\
                         StructField("menu_item_name",StringType()),\
                         StructField("item_category",StringType()),\
                         StructField("item_subcategory",StringType()),\
                         StructField("cost_of_goods_usd",IntegerType()),\
                         StructField("sale_price_usd",IntegerType()),\
                         StructField("menu_item_health_metrics_obj",VariantType())])
    
    Copy

    这段代码将创建一个名为 menu_schemaStructType 对象。该对象包含描述暂存区中 CSV 文件字段的 StructField 对象的 list。有关更多信息,请参阅 处理暂存区中的文件

  4. 工作表中的此步骤包括以下代码:

    # Create a Dataframe from our Menu file from our Blob Stage
    df_blob_stage_read = session.read.schema(menu_schema).csv('@tasty_bytes_sample_data.public.blob_stage/raw_pos/menu/')
    
    Copy

    该行创建 df_blob_stage_read DataFrame。该 DataFrame 被配置为使用指定的 menu_schema 架构,从位于指定暂存区的 CSV 文件读取数据。此架构包含数据列的类型和名称信息。

    # Save our Dataframe as a Menu table in our Tasty Bytes Database and Raw POS Schema
    df_blob_stage_read.write.mode("overwrite").save_as_table("tasty_bytes_sample_data.raw_pos.menu")
    
    Copy

    这段代码使用 `save_as_table<https://docs.snowflake.com/en/developer-guide/snowpark/reference/python/latest/api/snowflake.snowpark.DataFrameWriter.save_as_table>`_ 方法创建 menu 表,并将暂存区内的数据加载到该表中。

  5. 工作表中的此步骤包括以下代码:

    # Create a new Dataframe reading from our Menu table and filtering for the Freezing Point brand
    df_menu_freezing_point = session.table("tasty_bytes_sample_data.raw_pos.menu").filter(col("truck_brand_name") == 'Freezing Point')
    
    Copy

    此行创建 df_menu_freezing_point DataFrame,并将其配置为查询 menu 表。筛选器 方法使用条件表达式准备执行 SQL。条件表达式会筛选 menu 表中的行,返回 truck_brand_name 列中等于 Freezing Point 的行(类似于 WHERE 子句)。

    # return our Dataframe
    return df_menu_freezing_point
    
    Copy

    此行返回 df_menu_freezing_point DataFrame,这样查询就可以执行了。DataFrames 评估延迟,这意味着此行不会将查询发送到服务器以执行。

准备就绪后,选择 Run 运行代码并查看输出。选择 Run 时,Python 工作表会执行 Python 代码,生成并执行 SQL 语句。对返回的 DataFrame 执行查询,结果显示在工作表中。

您的输出看起来类似于下图。

表格输出包含以下列:MENU_ID、MENU_TYPE_ID、MENU_TYPE、TRUCK_BRAND_NAME、MENU_ITEM_ID。第一行具有以下值:10001、1、Ice Cream、Freezing Point、10。

第 4 步:清理、总结和其他资源

恭喜!您已成功完成此试用账户教程。

请花几分钟时间查看简短的总结和教程中涵盖的要点。考虑删除在本教程中创建的所有对象以进行清理。通过查看 Snowflake 文档中的其他主题了解更多信息。

清理教程对象(可选)

如果不再需要您在本教程中创建的对象,可以使用 DROP <object> 命令将它们从系统中删除。要删除创建的数据库,请运行以下命令:

DROP DATABASE IF EXISTS tasty_bytes_sample_data;
Copy

总结和要点

总之,您会使用在 Snowsight 中预先加载的 Python 工作表,在 Python 代码中完成以下步骤:

  1. 为 Python 应用程序导入 Snowpark 模块。

  2. 创建一个 Python 函数。

  3. 创建数据库和架构。

  4. 创建一个在 Amazon S3 桶中保存数据的暂存区。

  5. 创建 DataFrame,指定暂存区中的数据源。

  6. 创建一个包含暂存区文件数据的表格。

  7. 设置 DataFrame 以查询新表并筛选数据。

以下是有关加载和查询数据的一些要点:

  • 您使用 Snowpark 在 Python 代码中执行了SQL 语句。

  • 您创建了一个暂存区来加载 CSV 文件中的数据。

  • 您创建了一个用于存储数据的数据库和一个用于对数据库对象进行逻辑分组的架构。

  • 您使用 DataFrame 为查询指定数据源,并为查询筛选数据。

下一步是什么?

请使用以下资源继续了解 Snowflake :

  • 完成 Snowflake 提供的其他教程:

  • 熟悉 Snowflake 的主要概念和功能,以及用于执行查询和插入/更新数据的 Snowpark Python 类和方法:

  • 尝试 Snowflake 提供的 Tasty Bytes Quickstarts:

    • Tasty Bytes Quickstarts (https://quickstarts.snowflake.com/?cat=tasty-bytes)

语言: 中文