前幾天看 S3/Glacier FAQ 時,看到有 SELECT 這個功能,是去年推出的。S3/Glacier select 這功能是這樣子,你可以把 CSV/JSON/Apache Parquet 這幾種格式的檔案放到 S3/Glacier 上,然後就可以使用類似 SQL 的敘述來查詢檔案內容。
- Amazon S3 宣布推出適用於 S3 Select 的新功能
- AWS S3 SELECT Command
- Selecting Content from Objects
- How to Use S3 Select to Save Time on Amazon S3
所以我們可以把不常使用的資料從資料庫移轉到 S3/Glacier 上,需要時,再使用 S3 SELECT 來查詢。這樣資料庫不需要一直擴充容量,放到 S3/Glacier 可以降低資料庫儲存的成本。
使用範例:
- Python + boto3 https://github.com/gregwhitaker/s3-select-example
不過,網路上能找到的範例多半都是使用 CSV,那使用 JSON 又是如何呢?我試了以後,發現這個 JSON 格式不是我在 Python 用 json.dump() 傾印出來就搞定的。資料是陣列時,要針對每個元素去 dump,不可以是 [{}, {},…] 這樣,必須是 {} {} {} 這樣子,AWS API 才不會報錯 (參考:stackoverflow – amazon s3 – s3-select querying data on field name)。
import json with open('output.json', 'wt') as fout: for obj in objs: json.dump(obj, fout, indent=2, ensure_ascii=True) # 輸出結果 """ { "id": 13930241}{ "id": 13930240} """