SQL で作成したストアドプロシージャの Scala ハンドラーを記述します。¶
ハンドラーコードを使用してファイルの内容を読み取ることができます。ファイルは、ハンドラーが使用できるSnowflakeのステージである必要があります。たとえば、ファイルを読み取って、ハンドラーで非構造化データを処理する場合があります。
ステージングされたファイルのコンテンツを読み取るには、 SnowflakeFile
クラスまたは InputStream
クラスのいずれかでメソッドを呼び出すことができます。コンピューティング中、ファイルに動的にアクセスする必要があるときは、これを実行する場合があります。詳細については、このトピック内の SnowflakeFile を使用した動的に指定されたファイルの読み取り または InputStream を使用した動的に指定されたファイルの読み取り をご参照ください。
SnowflakeFile
は、次のテーブルで説明されているように、 InputStream
では利用できない機能を提供します。
クラス |
入力 |
メモ |
---|---|---|
|
URL フォーマット:
ファイルは、名前付き内部ステージまたは外部ステージに配置されている必要があります。 |
ファイルサイズなど、追加のファイル属性に簡単にアクセスできます。 |
|
URL フォーマット:
ファイルは、名前付き内部ステージまたは外部ステージに配置されている必要があります。 |
注釈
所有者権限のストアドプロシージャの場合は、プロシージャの所有者にスコープ付き URLs 以外のファイルへのアクセス権が必要があります。呼び出し元権限のプロシージャの場合は、呼び出し元にスコープが付いていない URLs のファイルへのアクセス権が必要です。いずれの場合も、新しい requireScopedUrl
パラメーターに boolean
の値を指定して SnowflakeFile.newInstance
メソッドを呼び出すハンドラーコードにより、ステージングされたファイルを読み取ることができます。
次の例では、スコープ付き URL が不要であることを指定し、 SnowflakeFile.newInstance
を使用します。
var filename = "@my_stage/filename.txt"
var sfFile = SnowflakeFile.newInstance(filename, false)
SnowflakeFile
を使用した動的に指定されたファイルの読み取り¶
次の例のコードには、 String
を受け取り、ファイルの内容を含む String
を返す、ハンドラー関数 execute
があります。実行時に、Snowflakeはプロシージャの input
変数にある受信ファイルパスからのハンドラーの fileName
変数を初期化します。ハンドラーコードは、 SnowflakeFile
インスタンスを使用してファイルを読み取ります。
CREATE OR REPLACE PROCEDURE file_reader_scala_proc_snowflakefile(input VARCHAR)
RETURNS VARCHAR
LANGUAGE SCALA
RUNTIME_VERSION = 2.12
HANDLER = 'FileReader.execute'
PACKAGES=('com.snowflake:snowpark:latest')
AS $$
import java.io.InputStream
import java.nio.charset.StandardCharsets
import com.snowflake.snowpark_java.types.SnowflakeFile
import com.snowflake.snowpark_java.Session
object FileReader {
def execute(session: Session, fileName: String): String = {
var input: InputStream = SnowflakeFile.newInstance(fileName).getInputStream()
return new String(input.readAllBytes(), StandardCharsets.UTF_8)
}
}
$$;
次の CALL の例にあるコードは、ファイルをポイントするスコープ付きファイル URL を作成します。これは、ステージ自体に権限を付与することなく、ステージングされたファイルへの仮アクセスを許可するエンコードされた URL です。
CALL file_reader_scala_proc_snowflakefile(BUILD_SCOPED_FILE_URL('@sales_data_stage', '/car_sales.json'));
InputStream
を使用した動的に指定されたファイルの読み取り¶
次の例のコードは、 InputStream
を受け取り、 String
ファイルの内容を返すハンドラー関数 execute
を定義しています。実行時に、Snowflakeはプロシージャの input
変数にある受信ファイルパスからのハンドラーの stream
変数を初期化します。ハンドラーコードは、 InputStream
を使用してファイルを読み取ります。
CREATE OR REPLACE PROCEDURE file_reader_scala_proc_input(input VARCHAR)
RETURNS VARCHAR
LANGUAGE SCALA
RUNTIME_VERSION = 2.12
HANDLER = 'FileReader.execute'
PACKAGES=('com.snowflake:snowpark:latest')
AS $$
import java.io.InputStream
import java.nio.charset.StandardCharsets
import com.snowflake.snowpark_java.Session
object FileReader {
def execute(session: Session, stream: InputStream): String = {
val contents = new String(stream.readAllBytes(), StandardCharsets.UTF_8)
return contents
}
}
$$;
次の CALL の例のコードは、ファイルを指すエンコードされたスコープ付きファイル URL を作成します。エンコードされた URL は、ステージ自体に権限を与えることなく、ステージングされたファイルへの仮アクセスを許可します。
CALL file_reader_scala_proc_input(BUILD_SCOPED_FILE_URL('@sales_data_stage', '/car_sales.json'));