在 DAY3 知識之章-Data Lake, Warehouse and Lakehouse 中,我們聊到新的儲存架構。本篇要帶大家認識 開放數據格式 (Open Data Format),它們是建構 Lakehouse 的核心之一。
開放數據格式指的是任何人都能自由使用、修改與分享的數據存儲格式,通常具備以下特徵:
特性 | 開放格式 | 專有格式 |
---|---|---|
規範透明度 | 完全公開 | 通常保密 |
工具支援 | 多廠商支援 | 單一廠商 |
長期保存 | 高可靠性 | 依賴廠商 |
互操作性 | 優秀 | 有限 |
創新速度 | 社群驅動 | 廠商控制 |
類別 | 格式 | 特點 | 優勢 | 劣勢 | 適用場景 |
---|---|---|---|---|---|
結構化 | CSV | 純文本、人類可讀 | 簡單、工具支援廣 | 無型別、無壓縮、查詢慢 | 小型數據、交換、匯出 |
半結構化 | JSON | 支援嵌套、Web 標準 | 靈活、語言支援廣 | 存儲效率低、查詢慢 | API 傳輸、設定檔 |
列式存儲 | Parquet | 列式存儲、高效壓縮 | 查詢快、壓縮好、支援 Schema 演進 | 寫入複雜、不適合頻繁更新 | 大數據分析、BI |
列式存儲 | ORC | Hive 優化、內建索引 | 極高壓縮比、快速讀取 | 限 Hadoop、生態較窄 | Hadoop/Hive 環境 |
行式存儲 | Avro | 行式存儲、Schema 演進 | 串流友好、序列化快 | 查詢慢、檔案大 | Kafka 串流、數據序列化 |
id,name,age
1,Alice,30
2,Bob,25
{
"id": 1,
"name": "Alice",
"skills": ["SQL", "Python"]
}
沒辦法直接讀取檔案,要透過程式或套件讀取。
import pandas as pd
# 建立 DataFrame
df = pd.DataFrame({"id":[1,2],"name":["Alice","Bob"]})
# 存成 Parquet
df.to_parquet("data.parquet")
print("已儲存成 data.parquet")
# 從 Parquet 讀回來
df2 = pd.read_parquet("data.parquet")
print(df2)
df2 資料呈現:
id name
0 1 Alice
1 2 Bob
Hive 建表語法
CREATE TABLE users (
id INT,
name STRING
) STORED AS ORC;
Schema 定義
{
"type": "record",
"name": "User",
"fields": [
{"name": "id", "type": "int"},
{"name": "name", "type": "string"}
]
}
根據不同的需求,選擇不同的檔案格式,才是最佳的方式。
如果要簡單的做區分,可以參考以下:
接著再搭配 Iceberg/Delta/Hudi 做表級治理、分區演進與小檔合併,才能真正把 Lakehouse 架構的價值展性出來。
在下一篇 「DAY5 知識之章 - Apache Iceberg」 中,我們將探索這個近年來最受矚目的 資料湖表格格式 (Table Format)。
它能解決傳統檔案格式的諸多限制,並帶來像資料庫一樣的操作體驗。
[1] Apache Parquet
[2] Apache ORC
[3] Apache Avro