Snowflake Notebooks でのファイルの操作

このトピックでは、 Snowflake Notebooks からファイルをアップロードしてアクセスする方法について説明します。

ノートブック環境のファイル

新しいノートブックを作成すると、2つのファイルが作成されます。ノートブックの左側にある 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 ファイルは表示されません。

Notebookセッションをまたいで永続化されるファイル

Notebookのセッションをまたいでファイルを永続化します。

Snowflakeステージにファイルを保管する

セッション間でファイルを持続させ、異なるノートブック間でファイルを参照したい場合は、Snowflakeステージを使用してファイルを保存します。ローカルマシンからステージにファイルをアップロードし、Snowpark APIからファイル操作を使ってノートブックからアクセスすることができます。

この例では、ステージを作成し、ノートブックからステージングされたファイルを保存および取得する方法を示します。

permanent_stage というステージングを作成するには、 SQL のセルで以下のコードを実行します。

CREATE OR REPLACE STAGE permanent_stage;
Copy

次に、 myfile.txt というファイルを作成し、その中にテキストを入れるために、Pythonのセルで以下のコードを実行します。

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

この時点で、 myfile.txt はノートブックの仮ファイルシステムに保存されていることに注意してください。これをステージングに移すには、Snowpark API を使って myfile.txtpermanent_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 Notebooksと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

ファイルを含むステージ。

制限と考慮事項

  • ノートブックセッションを開始する前にファイルをロードしてください。セッション開始後にファイルをロードした場合、ファイルにアクセスするにはセッションを再起動する必要があります。

  • アップロードするファイルの種類に制限はありません。

  • 1ファイルあたりのサイズ制限は250 MB以下です。

  • ノートブックのローカルパスに書き込まれたファイルは、 Files UI に表示されません。これは既知のバグです。しかし、ノートブックのコードでそのファイルを使うことはできるはずです。

    例えば、 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 ファイルを開くことはサポートされていません。

追加のリソース