SQL을 사용하여 생성된 저장 프로시저에 대한 Scala 처리기 작성하기

처리기 코드로 파일의 내용을 읽을 수 있습니다. 파일은 처리기에 사용할 수 있는 Snowflake 스테이지에 있어야 합니다. 예를 들어 처리기에서 비정형 데이터를 처리하기 위해 파일을 읽을 수 있습니다.

스테이징된 파일의 내용을 읽기 위해, 처리기는 SnowflakeFile 클래스 또는 InputStream 클래스의 메서드를 호출할 수 있습니다. 계산 중에 파일에 동적으로 액세스해야 하는 경우 이 작업을 수행할 수 있습니다. 자세한 내용은 이 항목의 SnowflakeFile 을 사용하여 동적으로 지정된 파일 읽기 또는 InputStream 을 사용하여 동적으로 지정된 파일 읽기 섹션을 참조하십시오.

SnowflakeFile 은 다음 표에 설명된 것처럼 InputStream 과 함께 사용할 수 없는 기능을 제공합니다.

클래스

입력

참고

SnowflakeFile

URL 형식:

  • 함수의 호출자가 소유자이기도 하지 않은 경우 파일 삽입 공격의 위험을 줄이기 위해 범위가 지정된 URL입니다.

  • UDF 소유자가 액세스할 수 있는 파일의 파일 URL 또는 문자열 경로입니다.

파일은 명명된 내부 스테이지 또는 외부 스테이지에 있어야 합니다.

파일 크기와 같은 추가 파일 특성에 쉽게 액세스할 수 있습니다.

InputStream

URL 형식:

  • 함수의 호출자가 소유자이기도 하지 않은 경우 파일 삽입 공격의 위험을 줄이기 위해 범위가 지정된 URL입니다.

파일은 명명된 내부 스테이지 또는 외부 스테이지에 있어야 합니다.

참고

소유자의 권한 저장 프로시저의 경우 프로시저의 소유자는 범위가 지정된 URL이 아닌 모든 파일에 액세스할 수 있어야 합니다. 호출자의 권한 프로시저의 경우 호출자는 범위가 지정된 URL이 아닌 모든 파일에 액세스할 수 있어야 합니다. 어느 경우든 처리기 코드가 새 requireScopedUrl 매개 변수에 대한 boolean 값으로 SnowflakeFile.newInstance 메서드를 호출하도록 하여 스테이징된 파일을 읽을 수 있습니다.

다음 예에서는 범위가 지정된 URL이 필요하지 않음을 지정하면서 SnowflakeFile.newInstance 를 사용합니다.

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

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)
  }
}
$$;
Copy

다음 CALL 예제의 코드는 범위 지정된 파일을 가리키는 URL을 생성합니다. 이것은 스테이지 자체에 권한을 부여하지 않고 스테이징된 파일에 대한 임시 액세스를 허용하는 인코딩된 URL입니다.

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

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
  }
}
$$;
Copy

다음 CALL 예의 코드는 파일을 가리키는 인코딩된 범위의 파일 URL 을 생성합니다. 인코딩된 URL 은 스테이지 자체에 권한을 부여하지 않고 스테이징된 파일에 대한 임시 액세스를 허용합니다.

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