在 Snowflake Notebooks 中处理文件

本主题介绍如何从 Snowflake Notebooks 上传和访问文件。

笔记本环境中的文件

创建新笔记本时,系统会创建笔记本主文件。您可以在笔记本左侧的 Files 选项卡中查看该文件。文件存储在代表笔记本环境的内部暂存区,并在会话之间持续存在。

  • 笔记本主文件:默认情况下,该文件名为 notebook_app.ipynb。如果笔记本是通过 Git 创建的,或者是从其他 .ipynb 文件上传的,文件名可能会有所不同。

  • environment.yml:此文件在安装新包后自动生成。它描述了您的笔记本环境,包括安装了哪些包。

要查看文件内容,请选择文件名以显示文件内容预览。

笔记本环境中的临时文件系统

笔记本有一个临时文件系统,可在活动会话期间使用。会话期间创建的任何文件都会保存在这个临时暂存区中。结束当前笔记本会话后,临时暂存区中的文件将不可用。

以下代码创建一个名为 myfile.txt 的文件,并在其中写入了一些文本:

with open("myfile.txt",'w') as f:
    f.write("abc")
f.close()
Copy

您可以在创建文件的同一会话中访问该文件。

使用 listdir() 方法列出临时暂存区中的文件:

import os
os.listdir()
Copy

现在断开当前会话并重新连接。再次尝试 listdir() 方法,系统将不会列出 myfile.txt 文件。

跨笔记本会话持久保存文件

要跨笔记本会话持久保存文件,请执行以下步骤:

在 Snowflake 暂存区中存储文件

如果您希望文件在不同会话之间持续存在,并在不同笔记本之间引用文件,可使用 Snowflake 暂存区来存储文件。您可以将文件从本地计算机上传到暂存区,然后通过 Snowpark API 中的文件操作从笔记本电脑访问这些文件。

示例

本例演示如何创建暂存区,并从中存储和检索笔记本中的文件。

要创建名为 permanent_stage 的暂存区,请在 SQL 单元格中运行以下代码:

CREATE OR REPLACE STAGE permanent_stage;
Copy

接下来,在 Python 单元格中运行以下代码,创建一个名为 myfile.txt 的文件,并在其中包含一些文本:

with open("myfile.txt",'w') as f:
  f.write("abc")
f.close()
Copy

请注意,myfile.txt 此时存储在笔记本的临时文件系统中。要将其移至暂存区,可以使用 Snowpark API 将 myfile.txt 上传到 permanent_stage

from snowflake.snowpark.context import get_active_session
session = get_active_session()

put_result = session.file.put("myfile.txt","@PERMANENT_STAGE", auto_compress= False)
put_result[0].status
Copy

如果断开会话并重新连接,可以在 SQL 单元格中运行以下代码来验证文件是否仍然出现:

LS @permanent_stage;
Copy

从本地计算机向笔记本添加文件

您可以从本地计算机上传文件,供 Snowflake 笔记本使用。

  1. 登录 Snowsight

  2. 选择 Projects » Notebooks

  3. Files 选项卡的数据库对象资源管理器旁边,选择 添加仪表板磁贴 图标,选择要上传的文件。

  4. 浏览并选择,或将文件拖放到对话框中。

  5. 选择 Upload 上传文件。

上传的文件会保存到笔记本的内部暂存区,并在会话之间持续存在。您可以使用笔记本文件中的本地路径引用上传的文件。请参阅 在笔记本中引用文件

备注

对于容器运行时的笔记本:如果上传文件时笔记本会话处于活动状态,则需要重新启动笔记本会话才能访问上传的文件。Snowflake 建议在启动会话之前添加所有需要的文件,以便在笔记本中使用。

与 Git 中的文件同步

如果笔记本已连接到 Git,则与笔记本位于同一 Git 文件夹中的任何文件都会显示在 Files 选项卡中。

有关在 Git 中处理文件的更多信息,请参阅 将 Snowflake 笔记本与 Git 存储库同步

在笔记本中引用文件

笔记本环境中的每个文件都有一个暂存区路径和一个本地路径。您可以使用这些路径在笔记本中引用文件。

使用 Python 引用本地路径

通常,Python 库使用文件的本地路径作为引用文件的方式。例如,下面的代码访问与运行该代码的笔记本位于同一目录下的 data.csv 文件:

import pandas as pd
df = pd.read_csv("data.csv")
Copy

使用 SQL 引用暂存区路径

在 SQL 中,Snowflake 根据暂存区路径引用文件。笔记本中文件的暂存区路径格式如下:

snow://notebook/<DATABASE>.<SCHEMA>.<NOTEBOOK_NAME>/versions/live/<file_name>
Copy

要查找与笔记本暂存区中文件关联的暂存区路径,可以使用 Copy path 菜单,按照以下步骤操作:

  1. 登录 Snowsight

  2. 选择 Projects » Notebooks

  3. Files 选项卡的数据库对象资源管理器旁,选择要获取路径的文件旁的 更多选项 图标。

  4. 选择 Copy path。这会将文件路径复制到剪贴板。

然后可以使用以下 SQL 语句列出暂存区文件的详细信息:

LIST 'snow://notebook/<DATABASE>.<SCHEMA>.<NOTEBOOK_NAME>/versions/live/data.csv'
Copy

访问控制要求

您需要使用具有以下权限的角色,才能访问笔记本暂存区中的文件。

权限

对象

USAGE

包含文件的暂存区。

限制和注意事项

  • 在启动笔记本会话前加载文件。如果在会话启动后加载文件,则必须重新启动会话才能访问这些文件。

  • 上传文件类型不受限制。

  • 每个文件的大小限制为 250 MB 或更小。

  • 写入笔记本本地路径的文件不会显示在 Files 选项卡中。不过,您仍然可以在笔记本代码中使用该文件。

    例如,如果您创建一个名为 data.json 的文件,即使它不会在 Files UI 中显示,您仍然可以按如下代码访问它:

    # Generate sample JSON file
    with open("data.json", "w") as f:
        f.write('{"fruit":"apple", "size":3.4, "weight":1.4},{"fruit":"orange", "size":5.4, "weight":3.2}')
    # Read from local JSON file (File doesn't show in UI)
    df = pd.read_json("data.json",lines=True)
    df
    
    Copy
  • 不支持打开另一个 .ipynb 文件,除非它是笔记本主文件。

其他资源

  • 如何在 Snowflake Notebooks 中处理文件 (https://github.com/Snowflake-Labs/snowflake-demo-notebooks/blob/main/Working%20with%20Files/Working%20with%20Files.ipynb)

  • 在 Snowflake Notebooks 中导航和浏览文件 (https://github.com/Snowflake-Labs/snowflake-demo-notebooks/blob/main/Navigating%20and%20Browsing%20Files/Navigating%20and%20Browsing%20Files.ipynb)

语言: 中文