物件業務的select介面

jackieathome發表於2024-07-23

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從入門到精通一篇就夠了)

相關文章