객체에 Amazon S3 Select를 사용하는 예시 - Amazon Simple Storage Service

객체에 Amazon S3 Select를 사용하는 예시

Amazon S3 콘솔, REST API 및 AWS SDK를 통해 S3 Select를 사용하여 단일 객체에서 콘텐츠를 선택할 수 있습니다.

S3 Select에서 지원되는 SQL 함수에 대한 자세한 내용은 SQL 함수 섹션을 참조하세요.

Amazon S3 콘솔의 객체에서 콘텐츠를 선택하려면
  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 버킷(Buckets)을 선택합니다.

  3. 콘텐츠를 선택하려는 객체를 포함하는 버킷을 선택한 다음 객체의 이름을 선택합니다.

  4. 객체 작업을 선택하고 S3 Select에서 쿼리를 선택합니다.

  5. 입력 데이터의 형식에 따라 입력 설정을 구성합니다.

  6. 수신하려는 출력 형식에 따라 출력 설정을 구성합니다.

  7. 선택한 객체에서 레코드를 추출하려면 SQL 쿼리에서 SELECT SQL 명령을 입력합니다. SQL 명령 작성 방법에 대한 자세한 내용은 Amazon S3 Select에 대한 SQL 참조를 참조하세요.

  8. SQL 쿼리를 입력한 후 SQL 쿼리 실행을 선택합니다. 그런 다음 쿼리 결과에서 SQL 쿼리 결과를 확인할 수 있습니다.

AWS SDK를 사용하여 한 객체에서 콘텐츠를 선택할 수 있습니다. 하지만 애플리케이션에서 요구할 경우 REST 요청을 직접 전송할 수 있습니다. 요청 및 응답 형식에 대한 자세한 내용은 SelectObjectContent를 참조하세요.

Amazon S3 Select를 통해 selectObjectContent 메서드를 사용하여 한 객체의 일부 콘텐츠를 선택할 수 있습니다. 이 메서드가 성공하면 SQL 표현식의 결과를 반환합니다.

Java

아래의 Java 코드는 CSV 형식으로 저장된 데이터를 포함하는 객체에 저장되어 있는 모든 레코드에 대해 첫 번째 열의 값을 반환합니다. 또한 ProgressStats 메시지를 반환하도록 요청합니다. 유효한 버킷 이름과 CSV 형식의 데이터를 포함하는 객체를 제공해야 합니다.

실제 예제를 작성 및 테스트하는 방법에 대한 자세한 내용은 Amazon S3 Java 코드 예제 테스트 섹션을 참조하세요.

package com.amazonaws; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.CSVInput; import com.amazonaws.services.s3.model.CSVOutput; import com.amazonaws.services.s3.model.CompressionType; import com.amazonaws.services.s3.model.ExpressionType; import com.amazonaws.services.s3.model.InputSerialization; import com.amazonaws.services.s3.model.OutputSerialization; import com.amazonaws.services.s3.model.SelectObjectContentEvent; import com.amazonaws.services.s3.model.SelectObjectContentEventVisitor; import com.amazonaws.services.s3.model.SelectObjectContentRequest; import com.amazonaws.services.s3.model.SelectObjectContentResult; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.concurrent.atomic.AtomicBoolean; import static com.amazonaws.util.IOUtils.copy; /** * This example shows how to query data from S3Select and consume the response in the form of an * InputStream of records and write it to a file. */ public class RecordInputStreamExample { private static final String BUCKET_NAME = "${my-s3-bucket}"; private static final String CSV_OBJECT_KEY = "${my-csv-object-key}"; private static final String S3_SELECT_RESULTS_PATH = "${my-s3-select-results-path}"; private static final String QUERY = "select s._1 from S3Object s"; public static void main(String[] args) throws Exception { final AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient(); SelectObjectContentRequest request = generateBaseCSVRequest(BUCKET_NAME, CSV_OBJECT_KEY, QUERY); final AtomicBoolean isResultComplete = new AtomicBoolean(false); try (OutputStream fileOutputStream = new FileOutputStream(new File (S3_SELECT_RESULTS_PATH)); SelectObjectContentResult result = s3Client.selectObjectContent(request)) { InputStream resultInputStream = result.getPayload().getRecordsInputStream( new SelectObjectContentEventVisitor() { @Override public void visit(SelectObjectContentEvent.StatsEvent event) { System.out.println( "Received Stats, Bytes Scanned: " + event.getDetails().getBytesScanned() + " Bytes Processed: " + event.getDetails().getBytesProcessed()); } /* * An End Event informs that the request has finished successfully. */ @Override public void visit(SelectObjectContentEvent.EndEvent event) { isResultComplete.set(true); System.out.println("Received End Event. Result is complete."); } } ); copy(resultInputStream, fileOutputStream); } /* * The End Event indicates all matching records have been transmitted. * If the End Event is not received, the results may be incomplete. */ if (!isResultComplete.get()) { throw new Exception("S3 Select request was incomplete as End Event was not received."); } } private static SelectObjectContentRequest generateBaseCSVRequest(String bucket, String key, String query) { SelectObjectContentRequest request = new SelectObjectContentRequest(); request.setBucketName(bucket); request.setKey(key); request.setExpression(query); request.setExpressionType(ExpressionType.SQL); InputSerialization inputSerialization = new InputSerialization(); inputSerialization.setCsv(new CSVInput()); inputSerialization.setCompressionType(CompressionType.NONE); request.setInputSerialization(inputSerialization); OutputSerialization outputSerialization = new OutputSerialization(); outputSerialization.setCsv(new CSVOutput()); request.setOutputSerialization(outputSerialization); return request; } }
JavaScript

S3 SelectObjectContent API와 함께 AWS SDK for JavaScript를 사용하여 Amazon S3에 저장된 JSON 및 CSV 파일에서 레코드를 선택하는 JavaScript 예제는 블로그 게시물 AWS SDK for JavaScript에서 Amazon S3 Select에 대한 지원 소개를 참조하세요.

Python

S3 Select를 사용하여 Amazon S3에 로드된 데이터를 쉼표로 구분된 값(CSV) 파일로 검색하기 위해 SQL 쿼리를 사용하는 Python 예제에 대해서는 블로그 게시물 Amazon S3 Select를 사용하여 서버나 데이터베이스 없이 데이터 쿼리를 참조하세요.