Javaストアドプロシージャによるファイルの読み込み¶
ハンドラーコードを使用してファイルの内容を読み取ることができます。ファイルは、ハンドラーが使用できるSnowflakeのステージである必要があります。たとえば、ファイルを読み取って、ハンドラーで非構造化データを処理する場合があります。
ステージングされたファイルのコンテンツを読み取るには、 SnowflakeFile
クラスまたは InputStream
クラスのいずれかでメソッドを呼び出すことができます。コンピューティング中、ファイルに動的にアクセスする必要があるときは、これを実行する場合があります。詳細については、このトピック内の SnowflakeFile を使用した動的に指定されたファイルの読み取り または InputStream を使用した動的に指定されたファイルの読み取り をご参照ください。
SnowflakeFile
は、次のテーブルで説明されているように、 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);
}
}
$$;
次の CALL の例にあるコードは、ファイルをポイントするスコープ付きファイル URL を作成します。これは、ステージ自体に権限を付与することなく、ステージングされたファイルへの仮アクセスを許可するエンコードされた URL です。
CALL file_reader_java_proc_snowflakefile(BUILD_SCOPED_FILE_URL('@sales_data_stage', '/car_sales.json'));
注釈
所有者権限のストアドプロシージャの場合は、プロシージャの所有者にスコープ付き URLs 以外のファイルへのアクセス権が必要があります。呼び出し元権限のプロシージャの場合は、呼び出し元にスコープが付いていない URLs のファイルへのアクセス権が必要です。いずれの場合も、新しい requireScopedUrl
パラメーターに boolean
の値を指定して SnowflakeFile.newInstance
メソッドを呼び出すハンドラーコードにより、ステージングされたファイルを読み取ることができます。
次の例では、スコープ付き URL が不要であることを指定し、 SnowflakeFile.newInstance
を使用します。
String filename = "@my_stage/filename.txt";
String sfFile = SnowflakeFile.newInstance(filename, false);
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;
}
}
$$;
次の CALL の例にあるコードは、ファイルをポイントするスコープ付きファイル URL を作成します。これは、ステージ自体に権限を付与することなく、ステージングされたファイルへの仮アクセスを許可するエンコードされた URL です。
CALL file_reader_java_proc_input(BUILD_SCOPED_FILE_URL('@sales_data_stage', '/car_sales.json'));