不像Athena是schema on read模式,Redshift是schema on write模式
作用于数据源到数据汇聚存储之间,典型使用就是传统数据库。数据不管是在入库还是采用装载外部数据或者将一个查询的输出结果写入数据库或者是使用UPDATE语句,数据库存储对于在数据写入数据库时都需要对schema进行检查控制,对照模式进行检查,如果在加载时发现数据不符合模式,则被拒绝加载数据。
作用于数据汇聚存储到数据查询分析之间,数据先存储,然后在需要查询分析的时候再为数据设置schema,底层存储不会在数据加载时进行验证,而是在查询数据时进行。
两种模式对比:
| 模式 | 定义 | 代表系统 |
|---|---|---|
| Schema on Write | 先定义表结构,再写入数据 | Redshift、传统数据库 |
| Schema on Read | 先存原始数据,查询时再定义结构 | Data Lake、Athena、Hive |
Redshift 的 Schema on Write 流程:
1. 先建表(定义 Schema)
↓
CREATE TABLE orders (
order_id INT,
customer_id INT,
amount DECIMAL(10,2),
order_date DATE
);
2. 再写入数据(必须符合 Schema)
↓
COPY orders FROM 's3://bucket/data.csv' ...
- 数据类型不对?❌ 报错
- 列数不对?❌ 报错
- 格式不对?❌ 报错
各自优缺点:
| 特性 | Schema on Write (Redshift) | Schema on Read (Data Lake) |
|---|---|---|
| 数据质量 | ✅ 高(写入时校验) | ⚠️ 不保证 |
| 查询性能 | ✅ 快(数据已优化存储) | 🐢 较慢 |
| 灵活性 | ❌ 低(改 Schema 麻烦) | ✅ 高 |
| 存储原始数据 | ❌ 必须转换 | ✅ 直接存 |
| ETL 成本 | ✅ 写入时做 | 查询时做 |
| 适合场景 | BI 报表、固定分析 | 探索性分析、原始日志 |
有一个例外是Spectrum,Redshift Spectrum 查 S3 外部表时,是 Schema on Read:
-- 外部表:Schema on Read
CREATE EXTERNAL TABLE spectrum.logs (
user_id INT,
action STRING,
ts TIMESTAMP
)
STORED AS PARQUET
LOCATION 's3://bucket/logs/';
-- 数据已经在 S3,建表时只是"声明"Schema
-- 查询时才真正解析数据
schema on read强调灵活自由,schema on write注重稳定和效率;schema on read与schema on write不是二者取一,而是相辅相成,互相协助;