Amazon S3 Glacier
开发人员指南 (API 版本 2012-06-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

SELECT 命令

Amazon S3 Select 和 Glacier Select 仅支持 SELECT SQL 命令。SELECT 支持以下 ANSI 标准子句:

  • SELECT list

  • FROM 子句

  • WHERE 子句

  • LIMIT 子句(仅限 Amazon S3 Select)

注意

Amazon S3 Select 和 Glacier Select 查询目前不支持子查询或联接。

SELECT 列表

SELECT 列表指定希望查询返回的列、函数和表达式。列表表示查询的输出。

SELECT * SELECT projection [ AS column_alias | column_alias ] [, ...]

第一个带 * (星号) 的表单按原样返回每个传递 WHERE 子句的行。第二个表单使用用户定义的输出标量表达式投影 为每列创建一行。

FROM 子句

Amazon S3 Select 和 Glacier Select 支持以下形式的 FROM 子句:

FROM table_name FROM table_name alias FROM table_name AS alias

其中 table_nameS3Object(适用于 Amazon S3 Select)、ARCHIVEOBJECT(适用于 Glacier Select)之一,指代正被查询的档案。对于来自传统关系数据库的用户,可以将其视为一个数据库架构,其中包含一个表的多个视图。

按照标准 SQL,FROM 子句将会创建在 WHERE 子句中筛选并在 SELECT 列表中投影的行。

对于在 Amazon S3 Select 中存储的 JSON 对象,您也可以使用以下形式的 FROM 子句:

FROM S3Object[*].path FROM S3Object[*].path alias FROM S3Object[*].path AS alias

使用这种形式的 FROM 子句,您可以从 JSON 对象内的数组或对象中进行选择。您可以使用以下形式之一指定 path

  • 通过名称(在对象中):.name['name']

  • 通过索引(在数组中):[index]

  • 通过通配符(在对象中):.*

  • 通过通配符(在数组中):[*]

注意

  • 这种形式的 FROM 子句只适用于 JSON 对象。

  • 通配符始终至少发射一条记录。如果没有匹配的记录,Amazon S3 Select 将发射值 MISSING。在输出序列化期间(在查询完成后),Amazon S3 Select 会将 MISSING 值替换为空记录。

  • 聚合函数(AVGCOUNTMAXMINSUM)会跳过 MISSING 值。

  • 如果您在使用通配符时未提供别名,则可使用路径中的最后一个元素引用行。例如,可以使用查询 SELECT price FROM S3Object[*].books[*].price 从书籍列表中选择所有价格。如果路径以通配符而不是名称结束,则可使用值 _1 来引用行。例如,您可以使用查询 SELECT _1.price FROM S3Object[*].books[*],而不是 SELECT price FROM S3Object[*].books[*].price

  • Amazon S3 Select 始终将 JSON 文档视为根级值组成的数组。因此,即使您查询的 JSON 对象只有一个根元素,FROM 子句也必须以 S3Object[*] 开头。但为了确保兼容性,Amazon S3 Select 允许您在不包含路径时省略通配符。因此,完整的子句 FROM S3Object 等效于 FROM S3Object[*] as S3Object。如果包含路径,则同时必须使用通配符。因此,FROM S3ObjectFROM S3Object[*].path 都是有效子句,但 FROM S3Object.path 不是。

示例:

示例 #1

此示例显示使用以下数据集和查询的结果:

{ "Rules": [ {"id": "id-1", "condition": "x < 20"}, {"condition": "y > x"}, {"id": "id-2", "condition": "z = DEBUG"} ] }, { "created": "June 27", "modified": "July 6" }
SELECT id FROM S3Object[*].Rules[*].id
{"id":"id-1"}, {}, {"id":"id-2"}, {}

Amazon S3 Select 因以下原因生成每个结果:

  • {"id":"id-1"} — S3Object[0].Rules[0].id 生成一个匹配项。

  • {} — S3Object[0].Rules[1].id 与记录不匹配,因此 Amazon S3 Select 输出 MISSING,后者随后在输出序列化期间变为空记录并返回。

  • {"id":"id-2"} — S3Object[0].Rules[2].id 生成一个匹配项。

  • {} — S3Object[1] 与 Rules 不匹配,因此 Amazon S3 Select 输出 MISSING,后者随后在输出序列化期间变为空记录并返回。

如果您不希望 Amazon S3 Select 在找不到匹配项时返回空记录,则可测试值 MISSING。以下查询将返回与上一查询相同的结果,但会省略空值:

SELECT id FROM S3Object[*].Rules[*].id WHERE id IS NOT MISSING
{"id":"id-1"}, {"id":"id-2"}

示例 #2

此示例显示使用以下数据集和查询的结果:

{ "created": "936864000", "dir_name": "important_docs", "files": [ { "name": "." }, { "name": ".." }, { "name": ".aws" }, { "name": "downloads" } ], "owner": "AWS S3" }, { "created": "936864000", "dir_name": "other_docs", "files": [ { "name": "." }, { "name": ".." }, { "name": "my stuff" }, { "name": "backup" } ], "owner": "User" }
SELECT d.dir_name, d.files FROM S3Object[*] d
{ "dir_name": "important_docs", "files": [ { "name": "." }, { "name": ".." }, { "name": ".aws" }, { "name": "downloads" } ] }, { "dir_name": "other_docs", "files": [ { "name": "." }, { "name": ".." }, { "name": "my stuff" }, { "name": "backup" } ] }
SELECT _1.dir_name, _1.owner FROM S3Object[*]
{ "dir_name": "important_docs", "owner": "AWS S3" }, { "dir_name": "other_docs", "owner": "User" }

WHERE 子句

WHERE 子句遵循以下语法:

WHERE condition

WHERE 子句根据 condition 筛选行。condition 是具有布尔结果的表达式。只有 condition 计算结果为 TRUE 的行才会在结果中返回。

LIMIT 子句 (仅限 Amazon S3 Select)

LIMIT 子句遵循以下语法:

LIMIT number

LIMIT 子句根据 number 限制您希望查询返回的记录数。

注意

Glacier 不支持 LIMIT 子句。

属性访问

SELECTWHERE 子句可以使用以下部分的任一方法引用记录数据,具体取决于将查询的文件是否采用 CSV 或 JSON 格式。

CSV

  • 列编号 – 您可以引用列名为 _N 的行的第 N 列,其中 N 是列位置。位置计数从 1 开始。例如,第一列名为 _1,第二列名为 _2

    您可以通过 _Nalias._N 引用列。例如,_2myAlias._2 都是有效的,都可用于引用 SELECT 列表中的列和 WHERE 子句。

  • 列标头 – 对于具有标头行的 CSV 格式的对象,可在 SELECT 列表和 WHERE 子句中使用这些标头。尤其在传统 SQL 的 SELECTWHERE 子句表达式中,可以通过 alias.column_namecolumn_name 引用列。

JSON (仅限 Amazon S3 Select)

  • 文档 – 可将 JSON 文档字段作为 alias.name 进行访问。还可以访问嵌套字段;例如,alias.name1.name2.name3

  • 列表 – 可以将零基索引与 [] 运算符结合使用以访问 JSON 列表中的元素。例如,可以通过 alias[1] 访问列表中第二个元素。可以结合字段以 alias.name1.name2[1].name3 的形式访问列表元素。

  • 示例:将此 JSON 对象视为示例数据集:

    {"name": "Susan Smith", "org": "engineering", "projects": [ {"project_name":"project1", "completed":false}, {"project_name":"project2", "completed":true} ] }

    示例 #1

    以下查询返回以下结果:

    Select s.name from S3Object s
    {"name":"Susan Smith"}

    示例 #2

    以下查询返回以下结果:

    Select s.projects[0].project_name from S3Object s
    {"project_name":"project1"}

标头/属性名称区分大小写

借助 Amazon S3 Select 和 Glacier Select,您可以使用双引号指示区分大小写的列标头(对于 CSV 对象)和属性(对于 JSON 对象)。如果不是有双引号,对象标头/属性不区分大小写。如果出现歧义,则会抛出错误。

以下示例是:1) 包含指定列标头且 FileHeaderInfo 设置为“用于”查询请求的 CSV 格式的 Amazon S3 或 Glacier 对象;或 2) 包含指定属性的 JSON 格式的 Amazon S3 对象。

示例 #1:将查询的对象具有标头/属性“NAME”。

  • 以下表达式从对象成功返回值 (无引号:不区分大小写):

    SELECT s.name from S3Object s
  • 以下表达式导致出现 400 错误 MissingHeaderName (包含引号:区分大小写):

    SELECT s."name" from S3Object s

示例 #2:将查询的 Amazon S3 对象具有一个包含“NAME”的标头/属性和另一个包含“name”的标头/属性。

  • 以下表达式导致出现 400 错误 AmbiguousFieldName (无引号:不区分大小写,但有两个匹配项):

    SELECT s.name from S3Object s
  • 以下表达式从对象成功返回值 (引号:区分大小写,因此可以解析歧义)。

    SELECT s."NAME" from S3Object s

将保留关键字作为用户定义的术语

Amazon S3 Select 和 Glacier Select 具有一组保留关键字,执行用于查询对象内容的 SQL 表达式时需要使用这组关键字。保留关键字包含函数名称、数据类型、运算符等。在某些情况下,诸如列标头 (用于 CSV 文件) 或属性 (用于 JSON 对象) 之类的用户定义的术语可能与保留关键字发生冲突。发生这种情况时,必须使用双引号指示您特意使用与保留关键字冲突的用户定义的术语。否则将会导致出现 400 解析错误。

有关保留关键字的完整列表,请参阅保留关键字

以下示例是:1) 包含指定列标头且 FileHeaderInfo 设置为“用于”查询请求的 CSV 格式的 Amazon S3 或 Glacier 对象;或 2) 包含指定属性的 JSON 格式的 Amazon S3 对象。

示例:将查询的对象具有名为“CAST”的标头/属性,这是保留关键字。

  • 以下表达式从对象成功返回值 (引号:利用用户定义的标头/属性):

    SELECT s."CAST" from S3Object s
  • 以下表达式导致出现 400 解析错误 (无引号:与保留关键字发生冲突):

    SELECT s.CAST from S3Object s

标量表达式

WHERE 子句和 SELECT 列表中,您可以使用 SQL 标量表达式 (返回标量值的表达式)。它们具有以下形式:

  • 文本

    SQL 文本。

  • column_reference

    column_namealias.column_name 形式引用列。

  • unary_op expression

    其中 unary_op 一元是一个 SQL 一元运算符。

  • expression binary_op expression

    其中 binary_op 是一个 SQL 二元运算符。

  • func_name

    其中 func_name 是要调用的标量函数的名称。

  • expression [ NOT ] BETWEEN expression AND expression

  • expression LIKE expression [ ESCAPE expression ]