Javaストアドプロシージャによるファイルの読み込み

ハンドラーコードを使用してファイルの内容を読み取ることができます。ファイルは、ハンドラーが使用できるSnowflakeのステージである必要があります。たとえば、ファイルを読み取って、ハンドラーで非構造化データを処理する場合があります。

ステージングされたファイルのコンテンツを読み取るには、 SnowflakeFile クラスまたは InputStream クラスのいずれかでメソッドを呼び出すことができます。コンピューティング中、ファイルに動的にアクセスする必要があるときは、これを実行する場合があります。詳細については、このトピック内の SnowflakeFile を使用した動的に指定されたファイルの読み取り または InputStream を使用した動的に指定されたファイルの読み取り をご参照ください。

SnowflakeFile は、次のテーブルで説明されているように、 InputStream では利用できない機能を提供します。

クラス

入力

メモ

SnowflakeFile

URL フォーマット:

  • 関数の呼び出し元がその所有者でもない場合に、ファイルインジェクション攻撃のリスクを軽減するためのスコープ URL を設定しました。

  • プロシージャーの所有者がアクセスできるファイル URL またはファイルの文字列パス。

ファイルは、名前付き内部ステージまたは外部ステージに配置されている必要があります。

ファイルサイズなど、追加のファイル属性に簡単にアクセスできます。

InputStream

URL フォーマット:

  • 関数の呼び出し元がその所有者でもない場合に、ファイルインジェクション攻撃のリスクを軽減するためのスコープ URL を設定しました。

ファイルは、名前付き内部ステージまたは外部ステージに配置されている必要があります。

SnowflakeFile を使用した動的に指定されたファイルの読み取り

次の例のコードには、 String を受け取り、ファイルの内容を含む String を返す、ハンドラー関数 execute があります。実行時に、Snowflakeはプロシージャの input 変数にある受信ファイルパスからのハンドラーの fileName 変数を初期化します。ハンドラーコードは、 SnowflakeFile インスタンスを使用してファイルを読み取ります。

CREATE OR REPLACE PROCEDURE file_reader_java_proc_snowflakefile(input VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVA
RUNTIME_VERSION = 11
HANDLER = 'FileReader.execute'
PACKAGES=('com.snowflake:snowpark:latest')
AS $$
import java.io.InputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import com.snowflake.snowpark_java.types.SnowflakeFile;
import com.snowflake.snowpark_java.Session;

class FileReader {
  public String execute(Session session, String fileName) throws IOException {
    InputStream input = SnowflakeFile.newInstance(fileName).getInputStream();
    return new String(input.readAllBytes(), StandardCharsets.UTF_8);
  }
}
$$;
Copy

次の CALL の例にあるコードは、ファイルをポイントするスコープ付きファイル URL を作成します。これは、ステージ自体に権限を付与することなく、ステージングされたファイルへの仮アクセスを許可するエンコードされた URL です。

CALL file_reader_java_proc_snowflakefile(BUILD_SCOPED_FILE_URL('@sales_data_stage', '/car_sales.json'));
Copy

注釈

所有者権限のストアドプロシージャの場合は、プロシージャの所有者にスコープ付き URLs 以外のファイルへのアクセス権が必要があります。呼び出し元権限のプロシージャの場合は、呼び出し元にスコープが付いていない URLs のファイルへのアクセス権が必要です。いずれの場合も、新しい requireScopedUrl パラメーターに boolean の値を指定して SnowflakeFile.newInstance メソッドを呼び出すハンドラーコードにより、ステージングされたファイルを読み取ることができます。

次の例では、スコープ付き URL が不要であることを指定し、 SnowflakeFile.newInstance を使用します。

String filename = "@my_stage/filename.txt";
String sfFile = SnowflakeFile.newInstance(filename, false);
Copy

InputStream を使用した動的に指定されたファイルの読み取り

次の例のコードには、 InputStream を受け取り、ファイルの内容を含む String を返す、ハンドラー関数 execute があります。実行時に、Snowflakeはプロシージャの input 引数にある受信ファイルパスからのハンドラーの stream 変数を初期化します。ハンドラーコードは、 InputStream を使用してファイルを読み取ります。

CREATE OR REPLACE PROCEDURE file_reader_java_proc_input(input VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVA
RUNTIME_VERSION = 11
HANDLER = 'FileReader.execute'
PACKAGES=('com.snowflake:snowpark:latest')
AS $$
import java.io.InputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import com.snowflake.snowpark.Session;

class FileReader {
  public String execute(Session session, InputStream stream) throws IOException {
    String contents = new String(stream.readAllBytes(), StandardCharsets.UTF_8);
    return contents;
  }
}
$$;
Copy

次の CALL の例にあるコードは、ファイルをポイントするスコープ付きファイル URL を作成します。これは、ステージ自体に権限を付与することなく、ステージングされたファイルへの仮アクセスを許可するエンコードされた URL です。

CALL file_reader_java_proc_input(BUILD_SCOPED_FILE_URL('@sales_data_stage', '/car_sales.json'));
Copy