使用 Snowpark Python 加载和查询示例数据¶
简介¶
本教程使用一个名为 Tasty Bytes 的虚构食品卡车品牌来向您展示如何使用 Snowpark Python 在 Snowflake 中加载和查询数据。您将使用 Snowsight 中预加载的 Python 工作表来完成这些任务。
下图提供了 Tasty Bytes 的概述。
备注
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,请执行以下操作:
在支持的 Web 浏览器中,导航至 https://app.snowflake.cn。
提供 账户标识符 或账户 URL。如果您之前登录过 Snowsight,可能会看到一个可以选择的账户名称。
使用 Snowflake 账户凭据登录。
第 2 步:打开 Python 工作表¶
您可以使用 Python 工作表来编写和运行 Python 代码。您的试用账户有权访问本教程的预加载 Python 工作表。该工作表具有 Python 代码,可运行以创建数据库、加载数据至数据库和查询数据。有关 Python 工作表的更多信息,请参阅 在 Python 工作表中编写 Snowpark 代码。
要打开预加载的 Python 工作表教程,请执行以下操作:
选择 Projects » Worksheets 以打开工作表列表。
打开 [Tutorial] Using Python to load and query sample data。
您的工作表看起来类似于下图。
这个预加载的 Python 工作表会自动使用 ACCOUNTADMIN 系统角色,以便查看和管理账户中的对象。有关更多信息,请参阅 使用 ACCOUNTADMIN 角色。
工作表还使用了 COMPUTE_WH 虚拟仓库。仓库提供创建和管理对象以及运行 SQL 命令所需的资源。这些资源包括 CPU、内存和临时存储。有关更多信息,请参阅 虚拟仓库。
第 3 步:学习如何使用 Python 工作表¶
Python 工作表让您在 Snowsight 中使用 Snowpark Python 来运行 SQL 语句。本教程的这一步描述了 Python 工作表中每个步骤的代码。使用 Python 工作表时,不能单独运行单个代码块。您必须运行整个工作表。在工作表中选择 Run 之前,请回顾以下步骤,以便更好地理解 Python 代码。
在打开的 Python 工作表中,该步骤包括以下代码:
import snowflake.snowpark as snowpark from snowflake.snowpark.functions import col from snowflake.snowpark.types import StructField, StructType, IntegerType, StringType, VariantType
本教程会导入
snowpark
包以及选定的类和函数,以便您的代码使用它们。工作表中的此步骤包括以下代码:
def main(session: snowpark.Session):
这一行定义了默认的
main
处理程序函数。处理程序函数包含您将在本教程中运行的代码。这一行会传递Session
对象,您可以用它在 Snowflake 中执行 SQL 语句。# Use SQL to create our Tasty Bytes Database session.sql('CREATE OR REPLACE DATABASE tasty_bytes_sample_data;').collect()
此行将创建一个名为
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()
此行将在
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()
此行创建了一个名为
blob_stage
的暂存区。暂存区是保存要加载到 Snowflake 数据库的数据文件的位置。本教程会创建一个从 Amazon S3 桶加载数据的暂存区。本教程使用的是一个现有的桶,其中有包含数据的 CSV 文件。它会将 CSV 文件中的数据加载到本教程稍后创建的表中。有关更多信息,请参阅 从 Amazon S3 批量加载。工作表中的此步骤包括以下代码:
# 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())])
这段代码将创建一个名为
menu_schema
的StructType
对象。该对象包含描述暂存区中 CSV 文件字段的StructField
对象的list
。有关更多信息,请参阅 处理暂存区中的文件。工作表中的此步骤包括以下代码:
# 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/')
该行创建
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")
这段代码使用 `save_as_table<https://docs.snowflake.com/en/developer-guide/snowpark/reference/python/latest/api/snowflake.snowpark.DataFrameWriter.save_as_table>`_ 方法创建
menu
表,并将暂存区内的数据加载到该表中。工作表中的此步骤包括以下代码:
# 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')
此行创建
df_menu_freezing_point
DataFrame,并将其配置为查询menu
表。筛选器 方法使用条件表达式准备执行 SQL。条件表达式会筛选menu
表中的行,返回truck_brand_name
列中等于Freezing Point
的行(类似于 WHERE 子句)。# return our Dataframe return df_menu_freezing_point
此行返回
df_menu_freezing_point
DataFrame,这样查询就可以执行了。DataFrames 评估延迟,这意味着此行不会将查询发送到服务器以执行。
准备就绪后,选择 Run 运行代码并查看输出。选择 Run 时,Python 工作表会执行 Python 代码,生成并执行 SQL 语句。对返回的 DataFrame 执行查询,结果显示在工作表中。
您的输出看起来类似于下图。
第 4 步:清理、总结和其他资源¶
恭喜!您已成功完成此试用账户教程。
请花几分钟时间查看简短的总结和教程中涵盖的要点。考虑删除在本教程中创建的所有对象以进行清理。通过查看 Snowflake 文档中的其他主题了解更多信息。
清理教程对象(可选)¶
如果不再需要您在本教程中创建的对象,可以使用 DROP <object> 命令将它们从系统中删除。要删除创建的数据库,请运行以下命令:
DROP DATABASE IF EXISTS tasty_bytes_sample_data;
总结和要点¶
总之,您会使用在 Snowsight 中预先加载的 Python 工作表,在 Python 代码中完成以下步骤:
为 Python 应用程序导入 Snowpark 模块。
创建一个 Python 函数。
创建数据库和架构。
创建一个在 Amazon S3 桶中保存数据的暂存区。
创建 DataFrame,指定暂存区中的数据源。
创建一个包含暂存区文件数据的表格。
设置 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)