使用 Amazon S3 Select 筛选和检索数据 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 Amazon S3 Select 筛选和检索数据

利用 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 参考

您可以使用 Amazon SDK、SelectObjectContent REST API 操作、Amazon Command Line Interface(Amazon CLI)或 Amazon S3 控制台执行 SQL 查询。Amazon S3 控制台将返回的数据量限定为 40 MB。要检索更多数据,请使用 Amazon CLI 或 API。

要求和限制

以下是使用 Amazon S3 Select 的要求:

  • 您必须拥有所查询的对象的 s3:GetObject 权限。

  • 如果您查询的对象已使用具有客户提供的加密密钥的客户端加密(SSE-C)进行加密,则必须使用 https,并且您必须在请求中提供加密密钥。

使用 Amazon S3 Select 时存在以下限制:

  • 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 存储类

在将 Amazon S3 Select 用于 Parquet 对象时,以下额外限制适用:

  • Amazon S3 Select 仅支持使用 GZIP 或 Snappy 的列式压缩。Amazon S3 Select 对于 Parquet 对象不支持整个对象压缩。

  • Amazon S3 Select 不支持 Parquet 输出。您必须将输出格式指定为 CSV 或 JSON。

  • 未压缩的最大行组大小为 512MB。

  • 您必须使用在对象的模式中指定的数据类型。

  • 选择重复字段将只返回最后一个值。

构建请求

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

有关构造 Amazon S3 Select 请求的更多信息,请参阅《Amazon Simple Storage Service API 参考》中的 SelectObjectContent。您也可以参阅以下部分中的某个开发工具包代码示例。

使用扫描范围的请求

借助 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 扫描范围请求可在 Amazon CLI、Amazon S3 API 和 Amazon SDK 中使用。您可以在 Amazon S3 Select 请求中使用 ScanRange 参数来实现此功能。有关更多信息,请参阅《Amazon Simple Storage Service API 参考》中的 SelectObjectContent

错误

如果在尝试运行查询时遇到问题,Amazon S3 Select 将返回错误代码和关联的错误消息。有关错误代码和描述的列表,请参阅 Amazon Simple Storage Service API 参考中的错误响应页面的 SELECT 对象内容错误代码列表部分。

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