AWS S3
官方文件
- Filtering and retrieving data using Amazon S3 Select
- SQL reference for Amazon S3 Select
- SELECT command
- Data types
- Operators
- Reserved keywords
- SQL functions
- Aggregate functions
- Conditional functions
- Conversion functions
- Date functions
- String functions
API
- SelectObjectContent
- boto3 s3 select_object_content
實現方案
介面定義
請求訊息的格式,參照SelectObjectContent,如下:
POST /{Key+}?select&select-type=2 HTTP/1.1
Host: Bucket.s3.amazonaws.com
x-amz-server-side-encryption-customer-algorithm: SSECustomerAlgorithm
x-amz-server-side-encryption-customer-key: SSECustomerKey
x-amz-server-side-encryption-customer-key-MD5: SSECustomerKeyMD5
x-amz-expected-bucket-owner: ExpectedBucketOwner
<?xml version="1.0" encoding="UTF-8"?>
<SelectObjectContentRequest xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Expression>string</Expression>
<ExpressionType>string</ExpressionType>
<RequestProgress>
<Enabled>boolean</Enabled>
</RequestProgress>
<InputSerialization>
<CompressionType>string</CompressionType>
<CSV>
<AllowQuotedRecordDelimiter>boolean</AllowQuotedRecordDelimiter>
<Comments>string</Comments>
<FieldDelimiter>string</FieldDelimiter>
<FileHeaderInfo>string</FileHeaderInfo>
<QuoteCharacter>string</QuoteCharacter>
<QuoteEscapeCharacter>string</QuoteEscapeCharacter>
<RecordDelimiter>string</RecordDelimiter>
</CSV>
<JSON>
<Type>string</Type>
</JSON>
<Parquet>
</Parquet>
</InputSerialization>
<OutputSerialization>
<CSV>
<FieldDelimiter>string</FieldDelimiter>
<QuoteCharacter>string</QuoteCharacter>
<QuoteEscapeCharacter>string</QuoteEscapeCharacter>
<QuoteFields>string</QuoteFields>
<RecordDelimiter>string</RecordDelimiter>
</CSV>
<JSON>
<RecordDelimiter>string</RecordDelimiter>
</JSON>
</OutputSerialization>
<ScanRange>
<End>long</End>
<Start>long</Start>
</ScanRange>
</SelectObjectContentRequest>
響應訊息的格式,參照SelectObjectContent,如下:
HTTP/1.1 200
<?xml version="1.0" encoding="UTF-8"?>
<Payload>
<Records>
<Payload>blob</Payload>
</Records>
<Stats>
<Details>
<BytesProcessed>long</BytesProcessed>
<BytesReturned>long</BytesReturned>
<BytesScanned>long</BytesScanned>
</Details>
</Stats>
<Progress>
<Details>
<BytesProcessed>long</BytesProcessed>
<BytesReturned>long</BytesReturned>
<BytesScanned>long</BytesScanned>
</Details>
</Progress>
<Cont>
</Cont>
<End>
</End>
</Payload>
介面規格
- 物件的資料格式,支援
- CSV
- JSON
- Parquet
- 支援檢索壓縮過的物件,支援的壓縮演算法
- GZIP
- BZIP2
- 資料的字符集,支援
UTF-8
。 - 支援使用SSE-C加密的物件。
- 輸出檢索結果時,支援
- CSV
- JSON
- 物件的大小,與現有規格保持一致。
- 使用PUT上傳的物件,5GiB。
- 使用多段方式上傳的物件,5TiB。
SQL的規格
- SQL子句,支援
SELECT
FROM
WHERE
LIMIT
- 資料型別,支援
- 布林
- 整型
- 字串
- 浮點數
- 時間戳
- 邏輯類運算子,支援
AND
NOT
OR
- 比較類運算子,支援
>
>=
<>
!=
<
<=
between
in
- 模式匹配類運算子,支援
LIKE
_
%
- 一元運算子,支援
IS NULL
IS NOT NULL
- 算術運算子,支援
+
-
*
/
%
- 關鍵字,參見Reserved keywords。
- 函式
- 聚合函式,支援
AVG
COUNT
MAX
MIN
SUM
- 條件函式,支援
CASE
COALESCE
NULLIF
- 型別轉換函式,支援
CAST
- 日期、時間函式,支援
DATE_ADD
DATE_DIFF
EXTRACT
TO_STRING
TO_TIMESTAMP
UTCNOW
- 聚合函式,支援
業務流程
- 物件有效性校驗
- 物件是否存在
- 訪問許可權
- 物件的格式
- 物件的加密引數
- 物件的大小
- 物件的壓縮格式
- 物件的資料的字符集
- 請求訊息體校驗
- SQL的解析和校驗
- 快取中提取檢索結果
- 快取中提取SQL的解析結果
- 執行SQL
- 封裝返回結果
技術點
- SQL解析
- 語法校驗
- 轉換為語法樹
- 執行語法樹
- SQL語法樹的維護
- 快取語法樹
- 檢索語法樹
- 老化語法樹
- 物件資料預處理
- 解密檔案
- 解壓縮檔案
- 解析JSON格式
- 解析CSV格式
- 解析Parquet格式
- 轉換為檢索格式
- 檢索處理
- 從檢索格式的資料中提取滿足要求的資料
- 快取檢索結果
- 從快取中提取檢索結果
- 老化快取中的資料
- 查詢結果返回
- 打包為CSV格式
- 打包為JSON格式
技術方案
整體方案,可以參考競品MINIO和CEPH現有的實現方案。
SQL的解析、語法樹的生成,可以基於ANTLR4實現。
物件的資料轉換為檢索結構,可以暫存在ElasticSearch中,支撐檢索的實現。
維護快取的演算法,可以參考LRU。
對於大規格的物件,需要考慮使用並行任務框架,同步執行處理,提高處理效率。
技術規格
- 對於解壓縮後的物件
- 單個物件的原始資料,佔用空間的規格。
- 單個物件的原始資料,暫存的保留時長。
- 物件的原始資料佔用空間的總的規格。
- 物件的資料轉換為適於檢索的格式後
- 單個物件的檢索格式的資料,暫存的保留時長。
- 檢索格式的資料,佔用空間的總的規格。
- SQL解析結構
- 快取時長。
- 佔用空間的規格。
- 檢索結果
- 快取時長。
- 佔用空間的規格。
參考資料
MINIO
- S3 API Compatibility
- Python Quickstart Guide
- Introducing Spark-Select for MinIO Data Lakes
- minio物件儲存系統的S3 Select 實現的分析
- minio select api 試用
CEPH
- CEPH S3 SELECT
- s3select
Antlr4
- antlr4
- 基於 Antlr4 的 Sql 解析
- Antlr4之簡單的sql查詢解析demo
Parquet
- Apache Parquet
- Apache Parquet ----大資料通用列式儲存檔案
Elasticsearch
- 官方站點
- 程式碼倉庫
- ElasticSearch (ES從入門到精通一篇就夠了)