3.6. S3 选择操作(技术预览)
作为开发人员,您可以使用 S3 为高分析应用程序(如 Spark-SQL)选择 API 来提高延迟和吞吐量。例如,带有几 GB 数据的 CSV S3 对象,用户可以使用以下查询提取由另一个列过滤的单列:
示例
select customerid from s3Object where age>30 and age<65;
目前,S3 对象必须在过滤和提取数据前通过 Ceph OSD 检索数据。当对象较大且查询更为具体时,性能会提高性能。
3.6.1. 先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- RESTful 客户端。
- 创建用户访问权限创建的 S3 用户。
3.6.2. S3 从对象中选择内容
选择的对象内容 API 通过结构化查询语言(SQL)过滤对象的内容。在请求中,您必须将数据序列化格式指定为对象的逗号分隔值(CSV)来检索指定的内容。Amazon Web Services(AWS)命令行界面(CLI)选择对象内容使用 CSV 格式将对象数据解析为记录,仅返回查询中指定的记录。
您必须为响应指定数据序列化格式。这个操作必须具有 s3:GetObject
权限。
语法
POST /BUCKET/KEY?select&select-type=2 HTTP/1.1\r\n
示例
POST /testbucket/sample1csv?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
- 描述
- stats 事件。
- Type
- Long
- 必需
- 否
Ceph 对象网关支持以下响应:
示例
{:event-type,records} {:content-type,application/octet-stream} :message-type,event}
语法
aws --endpoint-url http://localhost:80 s3api select-object-content --bucket BUCKET_NAME --expression-type 'SQL' --input-serialization '{"CSV": {"FieldDelimiter": "," , "QuoteCharacter": "\"" , "RecordDelimiter" : "\n" , "QuoteEscapeCharacter" : "\\" , "FileHeaderInfo": "USE" }, "CompressionType": "NONE"}' --output-serialization '{"CSV": {}}' --key OBJECT_NAME --expression "select count(0) from stdin where int(_1)<10;" output.csv
示例
aws --endpoint-url http://localhost:80 s3api select-object-content --bucket testbucket --expression-type 'SQL' --input-serialization '{"CSV": {"FieldDelimiter": "," , "QuoteCharacter": "\"" , "RecordDelimiter" : "\n" , "QuoteEscapeCharacter" : "\\" , "FileHeaderInfo": "USE" }, "CompressionType": "NONE"}' --output-serialization '{"CSV": {}}' --key testobject --expression "select count(0) from stdin where int(_1)<10;" output.csv
支持的功能
目前只支持 AWS s3 选择命令的一部分:
其它资源
- 如需了解更多详细信息,请参阅 Amazon 的 S3 Select Object Content API。
3.6.3. S3 支持的选择功能
S3 选择支持以下功能:.Timestamp
- timestamp(string)
- 描述
- 将字符串转换为基本时间戳类型。
- 支持
- 目前它转换:yyyyyy:mm:dd hh:mi:dd
- extract(date-part,timestamp)
- 描述
- 根据 date-part 从输入时间戳中提取的整数。
- 支持
- date-part: year,month,week,day。
- dateadd(date-part ,integer,timestamp)
- 描述
- 返回时间戳,根据输入时间戳和日期部分的结果计算。
- 支持
- 日期-部分:年、月、天.
- datediff(date-part,timestamp,timestamp)
- 描述
- 返回整数,根据 date-part 在两个时间戳之间计算的结果。
- 支持
- 日期-部分:年、月、天、小时.
- utcnow()
- 描述
- 返回当前时间的时间戳。
聚合
- count()
- 描述
- 根据与某个条件匹配的行数返回整数(如果只有一个条件)。
- sum(expression)
- 描述
- 如果出现某个条件,则每行上返回表达式摘要。
- avg(expression)
- 描述
- 如果每个行中返回一个平均表达式,与条件匹配一次。
- max(expression)
- 描述
- 如果出现某个条件,则返回与条件匹配的所有表达式的最大结果。
- min(expression)
- 描述
- 返回匹配某个条件的所有表达式的最小结果。
字符串
- substring(string,from,to)
- 描述
- 将字符串从输入字符串从输入字符串返回,到输入中。
- Char_length
- 描述
- 返回字符串中的多个字符。Character_length 也实现相同的目的。
- Trim
- 描述
- 从目标字符串中修剪前导或尾随字符,默认为空白字符。
- Upper\lower
- 描述
- 将字符转换为大写或小写。
NULL
NULL
值缺失或未知,即 NULL
无法为任何算术操作生成一个值。同样适用于算术比较,对 NULL
的任何比较都是未知的 NULL
。
A is NULL | 结果(NULL=UNKNOWN) |
---|---|
Not A |
|
A 或 False |
|
A or True |
|
A 或 A |
|
A 和 False |
|
A 和 True |
|
A 和 A |
|
其它资源
- 如需了解更多详细信息,请参阅 Amazon 的 S3 Select Object Content API。
3.6.4. S3 别名编程结构
别名编程结构是 s3 选择语言的重要组成部分,因为它可以为包含许多列或复杂查询的对象启用更好的编程。当解析别名结构的声明时,它会将别名替换为对右分列的引用,并在查询执行时评估引用与其他表达式一样。别名维护结果缓存,如果某个别名使用多次,则不会评估相同的表达式,并且返回相同的结果,因为使用了缓存的结果。目前,红帽支持列别名。
示例
select int(_1) as a1, int(_2) as a2 , (a1+a2) as a3 from s3object where a3>100 and a3<300;")
3.6.5. S3 CSV 解析解释
您可以使用输入序列化定义 CSV 定义,使用默认值:
-
将
{\n}'
用于 row-delimiter。 -
使用
{"}
括起内容。 -
使用
{\}
转义字符。
csv-header-info
被解析,这是包含该 schema 的输入对象中的第一行。目前,不支持输出序列化和压缩类型。S3 选择引擎具有 CSV 解析器,它解析 S3-objects:
- 每行以 row-delimiter 结束。
- field-separator 会分离相邻的列。
-
successive 字段分隔符定义
NULL
列。 - quote-character 覆盖了感叹号,即引号之间的任何字符。
- 转义字符将禁用除行分隔符外的任何特殊字符。
以下是 CSV 解析规则的示例:
功能 | 描述 | 输入(令牌) |
---|---|---|
| 成功字段分隔符 |
|
| quote 字符覆盖字段分隔符。 |
|
| 转义字符覆盖元字符。 |
对象所有者 |
| 没有封闭的引号,行分隔符是右线。 |
|
| FileHeaderInfo 标签 | USE 值表示第一行上的每个令牌都是列名称,IGNORE 值意味着跳过第一行。 |
其它资源
- 如需了解更多详细信息,请参阅 Amazon 的 S3 Select Object Content API。