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

참고

소유자의 권한 저장 프로시저의 경우 프로시저의 소유자는 범위가 지정된 URL이 아닌 모든 파일에 액세스할 수 있어야 합니다. 호출자의 권한 프로시저의 경우 호출자는 범위가 지정된 URL이 아닌 모든 파일에 액세스할 수 있어야 합니다. 어느 경우든 처리기 코드가 새 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