在 物件上使用 Amazon S3 Select 的範例 - Amazon Simple Storage Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 物件上使用 Amazon S3 Select 的範例

重要

Amazon S3 Select 不再提供給新客戶。Amazon S3 Select 的現有客戶可以繼續如常使用此功能。進一步了解

您可以使用 Amazon S3 主控台、 REST API和 從一個物件選取內容 AWS SDKs。 Amazon S3

如需 S3 Select 支援SQL函數的詳細資訊,請參閱 SQL 函數

若要從 Amazon S3 主控台中的物件選取內容
  1. 登入 AWS Management Console 並在 開啟 Amazon S3 主控台https://console.aws.amazon.com/s3/

  2. 在左側導覽窗格中,選擇 Buckets (儲存貯體)。

  3. 選擇包含您要從中選取內容的物件的儲存貯體,然後選擇物件名稱。

  4. 選擇物件動作,然後選擇使用 S3 Select 查詢

  5. 根據輸入資料的格式設定輸入設定

  6. 根據要接收的輸出格式設定輸出設定

  7. 若要從所選物件擷取記錄,請在SQL查詢 下,輸入 SELECT SQL 命令。如需如何撰寫SQL命令的詳細資訊,請參閱 SQL Amazon S3 Select 的參考

  8. 輸入SQL查詢後,選擇執行SQL查詢 。然後,在查詢結果 下,您可以看到SQL查詢的結果。

您可以使用 AWS SDKs 從物件選取內容。不過,如果您的應用程式需要它,您可以直接傳送REST請求。如需請求和回應格式的詳細資訊,請參閱 SelectObjectContent.

您可以使用 selectObjectContent方法,使用 Amazon S3 Select 來選取物件的某些內容。如果此方法成功,則會傳回SQL運算式的結果。

Java

下列 Java 程式碼會傳回儲存在包含以 CSV 格式儲存之資料的物件中,每個記錄的第一欄值。同時也要求回傳 ProgressStats 訊息。您必須提供有效的儲存貯體名稱和包含 CSV 格式資料的物件。

如需建立和測試工作範例的指示,請參閱 AWS SDK for 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

如需使用 AWS SDK for JavaScript 搭配 S3 SelectObjectContentAPI操作從 Amazon S3 中儲存JSONCSV的檔案中選取記錄 JavaScript 的範例,請參閱 中的部落格文章介紹對 Amazon S3 Select 的支援 AWS SDK for JavaScript

Python

如需使用 S3 Select 使用SQL查詢來搜尋以逗號分隔值 (CSV) 檔案載入 Amazon S3 的資料之 Python 範例,請參閱部落格文章使用 Amazon S3 Select 查詢沒有伺服器或資料庫的資料。 Amazon S3