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