在对象上使用 Amazon S3 Select 的示例 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

在对象上使用 Amazon S3 Select 的示例

您可以将 S3 Select 与 Amazon S3 控制台、REST API 和 Amazon SDK 一起使用,以从对象中选择内容。

有关 S3 Select 支持的 SQL 函数的更多信息,请参阅SQL 函数

在 Amazon S3 控制台中选择对象中的内容
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 在左侧导航窗格中,选择

  3. 选择包含您想要从中选择内容的对象的桶,然后选择对象的名称。

  4. 选择对象操作,然后选择使用 S3 Select 进行查询

  5. 根据输入数据的格式配置输入设置

  6. 根据要接收的输出的格式配置输出设置

  7. 要从所选对象中提取记录,请在 SQL 查询下输入 SELECT SQL 命令。有关如何编写 SQL 命令的更多信息,请参阅Amazon S3 Select 的 SQL 参考

  8. 输入 SQL 查询后,选择运行 SQL 查询。然后,在查询结果下,您可以看到 SQL 查询的结果。

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

有关将 Amazon SDK for JavaScript 与 S3 SelectObjectContent API 操作一起使用从 Amazon S3 中存储的 JSON 和 CSV 文件中选择记录的 JavaScript 示例,请参阅博客文章在 Amazon SDK for JavaScript 中引入对 Amazon S3 Select 的支持

Python

有关使用 SQL 查询来搜索通过使用 S3 Select 以逗号分隔值(CSV)文件形式加载到 Amazon S3 中的数据的 Python 示例,请参阅博客文章使用 Amazon S3 Select 在没有服务器或数据库的情况下查询数据