3.5. S3 选择操作(技术预览)
S3 选择操作只是一个技术预览功能。红帽产品服务级别协议(SLA)不支持技术预览功能,且其功能可能并不完善,因此红帽不建议在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。如需了解更多详细信息,请参阅红帽技术预览功能的支持范围。
作为开发者,您可以运行 S3 来加快吞吐量。用户可以在没有介质器的情况下直接运行 S3 选择查询。
有两个 S3 选择工作流,一个用于 CSV,一个用于 Apache Parquet (Parquet),它为 CSV 和 Parquet 对象提供 S3 选择操作。
- CSV 文件以纯文本格式存储表格数据。文件的每一行都是数据记录。
- Parquet 是一个开源、面向列的数据文件格式,专为高效数据存储和检索而设计。它提供了高效的数据压缩和编码方案,以增强性能以批量处理复杂数据。
例如,带有几 GB 数据的 CSV 或 Parquet S3 对象允许用户提取单个列,该列由另一个列过滤:
示例
select customerid from s3Object where age>30 and age<65;
select customerid from s3Object where age>30 and age<65;
目前,S3 对象必须通过 Ceph 对象网关从 Ceph OSD 检索数据,然后才能过滤和提取数据。当对象较大且查询更具体时,性能会提高性能。与 CSV 相比,Parquet 格式可以更有效地处理。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- RESTful 客户端。
- 创建的用户具有访问权限的 S3 用户。
3.5.1. S3 从对象中选择内容 复制链接链接已复制到粘贴板!
选择的对象内容 API 通过结构化查询语言(SQL)过滤对象的内容。如需清单对象中应驻留的内容的说明,请参阅 AWS 系统管理器用户指南中的清单收集的元数据部分。清单内容会影响针对该清单运行的查询类型。可能会提供基本信息的 SQL 语句数量较大,但 S3 选择是一个类似于 SQL 的实用程序,因此不支持某些运算符,如 group-by
和 join
。
对于 CSV,您必须将数据序列化格式指定为对象的逗号分隔值,以检索指定的内容。Parquet 没有分隔符,因为它采用二进制格式。Amazon Web Services (AWS)命令行界面(CLI)选择对象内容使用 CSV 或 Parquet 格式将对象数据解析到记录中,仅返回查询中指定的记录。
您必须为响应指定数据序列化格式。这个操作必须具有 s3:GetObject
权限。
-
InputSerialization
元素描述了正在查询的对象中数据的格式。对象可以是 CSV 或 Parquet 格式。 -
OutputSerialization
元素是 AWS-CLI 用户客户端的一部分,并描述了如何格式化输出数据。Ceph 为 AWS-CLI 实施服务器客户端,因此根据OutputSerialization
(当前只是 CSV)提供相同的输出。 -
InputSerialization
的格式不需要与OutputSerialization
的格式匹配。例如,您可以在InputSerialization
中指定 Parquet,在OutputSerialization
中指定 CSV。
语法
POST /BUCKET/KEY?select&select-type=2 HTTP/1.1\r\n
POST /BUCKET/KEY?select&select-type=2 HTTP/1.1\r\n
示例
POST /testbucket/sample1csv?select&select-type=2 HTTP/1.1\r\n POST /testbucket/sample1parquet?select&select-type=2 HTTP/1.1\r\n
POST /testbucket/sample1csv?select&select-type=2 HTTP/1.1\r\n
POST /testbucket/sample1parquet?select&select-type=2 HTTP/1.1\r\n
请求实体
Bucket
- 描述
- 要从中选择对象内容的存储桶。
- Type
- 字符串
- 必需
- 是
键
- 描述
- 对象密钥。
- 长度限制
- 最小长度为 1.
- Type
- 字符串
- 必需
- 是
SelectObjectContentRequest
- 描述
- 选择对象内容请求参数的根级别标签。
- Type
- 字符串
- 必需
- 是
表达式
- 描述
- 用于查询对象的表达式。
- Type
- 字符串
- 必需
- 是
ExpressionType
- 描述
- 示例 SQL 提供的表达式的类型。
- Type
- 字符串
- 有效值
- SQL
- 必需
- 是
InputSerialization
- 描述
- 描述正在查询的对象中数据的格式。
- Type
- 字符串
- 必需
- 是
OutputSerialization
- 描述
- 以逗号分隔符和新行返回的数据格式。
- Type
- 字符串
- 必需
- 是
响应实体
如果操作成功,服务会返回 HTTP 200
响应。服务以 XML 格式返回数据:
payload
- 描述
- 有效负载参数的根级别标签。
- Type
- 字符串
- 必需
- 是
Records
- 描述
- 记录事件。
- Type
- base64 编码的二进制数据对象
- 必需
- 否
Stats
- 描述
- 统计事件。
- Type
- Long
- 必需
- 否
Ceph 对象网关支持以下响应:
示例
{:event-type,records} {:content-type,application/octet-stream} :message-type,event}
{:event-type,records} {:content-type,application/octet-stream} :message-type,event}
语法(用于 CSV)
示例(用于 CSV)
语法(用于 Parquet)
示例(用于 Parquet)
支持的功能
目前只支持 AWS s3 选择命令的一部分:
3.5.2. S3 支持的选择功能 复制链接链接已复制到粘贴板!
S3 选择支持以下功能:.Timestamp
- timestamp(string)
- 描述
- 将字符串转换为基本时间戳类型。
- 支持
- 目前它转换:yyyy:mm:dd hh:mi:dd
- extract(date-part,timestamp)
- 描述
- 根据 date-part 从输入时间戳中提取的整数。
- 支持
- date-part: year、month、week、day.
- dateadd(date-part ,integer,timestamp)
- 描述
- 返回时间戳,根据输入时间戳和 date-part 的结果进行计算。
- 支持
- 日期部分: year,month,day.
- datediff(date-part,timestamp,timestamp)
- 描述
- 返回整数,根据 date-part 在两个时间戳之间计算的结果。
- 支持
- 日期部分: year、month、day、hours.
- utcnow()
- 描述
- 返回当前时间的时间戳。
聚合
- count()
- 描述
- 如果出现某个条件,则根据与条件匹配的行数返回整数。
- sum(expression)
- 描述
- 如果出现某个条件,则每行上返回表达式摘要。
- avg(expression)
- 描述
- 如果出现某个条件,则每行上返回一个平均表达式。
- max(expression)
- 描述
- 如果出现某个条件,则返回与条件匹配的所有表达式的最大结果。
- min(expression)
- 描述
- 如果出现某个条件,则返回与条件匹配的所有表达式的最小结果。
字符串
- substring(string,from,to)
- 描述
- 返回字符串根据 from 和 输入从输入中提取。
- Char_length
- 描述
- 返回字符串中的多个字符。Character_length 也实现相同的目的。
- Trim
- 描述
- 从目标字符串中修剪前导或尾随字符,默认为空白字符。
- Upper\lower
- 描述
- 将字符转换为大写或小写。
NULL
NULL
值缺失或未知,即 NULL
无法为任何算术操作生成一个值。这同样适用于算术比较,与 NULL
的任何比较都是 unknown 为 NULL
。
A is NULL | Result(NULL=UNKNOWN) |
---|---|
Not A |
|
A 或 False |
|
A or True |
|
A 或 A |
|
A 和 False |
|
A 和 True |
|
A 和 A |
|
3.5.3. S3 别名编程结构 复制链接链接已复制到粘贴板!
别名编程结构是 s3 选择语言的重要组成部分,因为它可以为包含许多列或复杂查询的对象启用更好的编程。当解析带有别名构造的语句时,它将别名替换为对右侧投射列的引用并在查询执行时,像任何其他表达式一样评估引用。别名维护结果-缓存(如果别名使用多次),则不会评估同一表达式,并返回相同的结果,因为使用了缓存的结果。目前,红帽支持列别名。
示例
select int(_1) as a1, int(_2) as a2 , (a1+a2) as a3 from s3object where a3>100 and a3<300;")
select int(_1) as a1, int(_2) as a2 , (a1+a2) as a3 from s3object where a3>100 and a3<300;")
3.5.4. S3 CSV 解析解释 复制链接链接已复制到粘贴板!
带有输入序列化的 CSV 定义使用以下默认值:
-
将
{\n}'
用于 row-delimiter。 -
使用
{"}
括起内容。 -
使用
{\}
转义字符。
在 AWS-CLI 中出现 USE
时解析 csv-header-info
;这是包含 schema 的输入对象中的第一行。目前,不支持输出序列化和压缩类型。S3 选择引擎具有 CSV 解析器,它解析 S3-objects:
- 每行以 row-delimiter 结尾。
- field-separator 会分离相邻的列。
-
successive 字段分隔符定义
NULL
列。 - quote-character 覆盖了 field-separator;即,字段分隔符是引号之间的任何字符。
- 转义字符禁用任何特殊字符,但行分隔符除外。
以下是 CSV 解析规则的示例:
功能 | 描述 | Input (Tokens) |
---|---|---|
| successive 字段分隔符 |
|
| quote 字符覆盖字段分隔符。 |
|
| 转义字符覆盖元字符。 |
对象所有者 |
| 没有闭引号;行分隔符是右行。 |
|
| FileHeaderInfo 标签 | USE 值表示第一行中的每个令牌都是列名称;IGNORE 值意味着跳过第一行。 |