

# 使用 Amazon S3 Select 就地查询数据
<a name="selecting-content-from-objects"></a>

**重要**  
不再向新客户提供 Amazon S3 Select。Amazon S3 Select 的现有客户可以像往常一样继续使用该功能。[了解详情](https://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/) 

利用 Amazon S3 Select，您可以使用结构化查询语言（SQL）语句筛选 Amazon S3 对象的内容，并仅检索所需的部分数据。通过使用 Amazon S3 Select 筛选此数据，您可以减少 Amazon S3 传输的数据量，这将减少检索此数据所需的成本和延迟。

Amazon S3 Select 只允许您一次查询一个对象。它适用于以 CSV、JSON 或 Apache Parquet 格式存储的对象。它还使用通过 GZIP 或 BZIP2 压缩的对象（仅对于 CSV 和 JSON 对象）和服务器端加密的对象。可以将结果的格式指定为 CSV 或 JSON，并且可以确定结果中记录的分隔方式。

可以在请求中将 SQL 表达式传递给 Amazon S3。Amazon S3 Select 支持一部分 SQL。有关 Amazon S3 Select 支持的 SQL 元素的更多信息，请参阅 [Amazon S3 Select 的 SQL 参考](s3-select-sql-reference.md)。

您可以使用 Amazon S3 控制台、AWS Command Line Interface（AWS CLI）、`SelectObjectContent` REST API 操作或 AWS SDK 执行 SQL 查询。

**注意**  
Amazon S3 控制台将返回的数据量限定为 40 MB。要检索更多数据，请使用 AWS CLI 或 API。

## 要求和限制
<a name="selecting-content-from-objects-requirements-and-limits"></a>

以下是使用 Amazon S3 Select 的要求：
+ 您必须拥有所查询的对象的 `s3:GetObject` 权限。
+ 如果您查询的对象已使用具有客户提供的加密密钥的客户端加密（SSE-C）进行加密，则必须使用 `https`，并且您必须在请求中提供加密密钥。

使用 Amazon S3 Select 时存在以下限制：
+ S3 Select 对于每个请求只能查询一个对象。
+ S3 Select 支持查询最大 5 TB 的文件。
+ SQL 表达式的最大长度为 256 KB。
+ 输入或结果中记录的最大长度为 1 MB。
+ Amazon S3 Select 只能使用 JSON 输出格式发出嵌套数据。
+ 您无法查询存储在 S3 Glacier Flexible Retrieval、S3 Glacier Deep Archive 或低冗余存储（RRS）存储类中的对象。您无法查询存储在 S3 Intelligent-Tiering 存档访问层或 S3 Intelligent-Tiering 深度存档访问层中的对象。有关存储类的更多信息，请参阅 [了解和管理 Amazon S3 存储类](storage-class-intro.md)。

在将 Amazon S3 Select 用于 Parquet 对象时，以下额外限制适用：
+ Amazon S3 Select 仅支持使用 GZIP 或 Snappy 的列式压缩。Amazon S3 Select 对于 Parquet 对象不支持整个对象压缩。
+ Amazon S3 Select 不支持 Parquet 输出。您必须将输出格式指定为 CSV 或 JSON。
+ 未压缩的最大行组大小为 512MB。
+ 您必须使用在对象的模式中指定的数据类型。
+ 选择重复字段将只返回最后一个值。

## 构建请求
<a name="selecting-content-from-objects-contructing-request"></a>

在构造请求时，您提供通过使用 `InputSerialization` 对象查询的对象的详细信息。您提供要使用 `OutputSerialization` 对象返回结果的方式的详细信息。您还包含 Amazon S3 用于筛选请求的 SQL 表达式。

有关构造 Amazon S3 Select 请求的更多信息，请参阅《Amazon Simple Storage Service API 参考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectSELECTContent.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectSELECTContent.html)。您也可以参阅以下部分中的某个开发工具包代码示例。

### 使用扫描范围的请求
<a name="selecting-content-from-objects-using-byte-range"></a>

借助 Amazon S3 Select，您可以通过指定要查询的字节范围来扫描对象的子集。利用此功能，您可以将工作分为一系列非重叠扫描范围的独立 Amazon S3 Select 请求，从而并行扫描整个对象。

 扫描范围不需要与记录边界对齐。Amazon S3 Select 扫描范围请求在您指定的字节范围内运行。查询将处理在指定的扫描范围内开始但延伸到该扫描范围之外的记录。例如，下面显示了包含一系列记录（采用以行分隔的 CSV 格式）的 Amazon S3 对象：

```
A,B
C,D
D,E
E,F
G,H
I,J
```

假设您使用 Amazon S3 Select `ScanRange` 参数，并从（字节）1 *开始*，在（字节）4 *结束*。因此，扫描范围将从“`,`”开始，并扫描直到记录结尾 `C`。您的扫描范围请求将返回结果 `C, D`，因为这是记录的结尾。

 Amazon S3 Select 扫描范围请求支持 Parquet、CSV（不带引号的分隔符）或 JSON 对象（仅在 `LINES` 模式下）。CSV 和 JSON 对象必须未压缩。对于基于行的 CSV 和 JSON 对象，当将扫描范围指定为 Amazon S3 Select 请求的一部分时，将处理在该扫描范围内开始的所有记录。对于 Parquet 对象，将处理在请求的扫描范围内开始的所有行组。

Amazon S3 Select 扫描范围请求可在 AWS CLI、Amazon S3 API 和 AWS SDK 中使用。您可以在 Amazon S3 Select 请求中使用 `ScanRange` 参数来实现此功能。有关更多信息，请参阅《Amazon Simple Storage Service API 参考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_SelectObjectContent.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_SelectObjectContent.html)。

## 错误
<a name="selecting-content-from-objects-errors"></a>

如果在尝试运行查询时遇到问题，Amazon S3 Select 将返回错误代码和关联的错误消息。有关错误代码和描述的列表，请参阅 *Amazon Simple Storage Service API 参考*中的*错误响应*页面的 [SELECT 对象内容错误代码列表](https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#SelectObjectContentErrorCodeList)部分。

有关 Amazon S3 Select 的更多信息，请参阅以下主题。

**Topics**
+ [要求和限制](#selecting-content-from-objects-requirements-and-limits)
+ [构建请求](#selecting-content-from-objects-contructing-request)
+ [错误](#selecting-content-from-objects-errors)
+ [在对象上使用 Amazon S3 Select 的示例](using-select.md)
+ [Amazon S3 Select 的 SQL 参考](s3-select-sql-reference.md)