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

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

在物件上使用 Amazon S3 選擇的範例

您可以使用 S3 選取從一個物件選取內容,方法是使用 Amazon S3 主控台、REST API 和 AWS 開發套件。

如需 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 命令的詳細資訊,請參閱 適用於 Amazon S3 Select 的 SQL 參考

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

您可以使用 AWS SDK 從物件中選取內容。但也可視應用程式所需,直接傳送 REST 要求。如需請求與回應格式的詳細資訊,請參閱 SelectObjectContent

您可以使用 Amazon S3 選取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

JavaScript 如需使用 AWS SDK for JavaScript 搭配 S3 SelectObjectContent API 操作從 Amazon S3 中存放的 JSON 和 CSV 檔案中選取記錄的範例,請參閱中的部落格文章介紹 Amazon S3 Select 支援的部落格文章 AWS SDK for JavaScript。

Python

如需有關使用 SQL 查詢,透過使用 S3 Select 來搜尋以逗號分隔值 (CSV) 檔案載入到 Amazon S3 的資料的 Python 範例,請參閱部落格文章使用 Amazon S3 Select 在無伺服器或資料庫的情形下查詢資料