3. S3 Select支持的格式
S3 Select 支持三种数据格式:CSV、JSON 和 Parquet。每种格式在存储效率、查询性能、Schema 灵活性上差异显著。选择正确的格式,是 S3 Select 性能优化的第一步。
核心原则:Parquet 在大多数分析场景下性能最优;JSON 适合半结构化、Schema 灵活的数据;CSV 适合简单表格数据,但缺乏类型信息,查询效率最低。
3.1 CSV 格式详解
CSV(逗号分隔值)是最通用的表格数据格式。S3 Select 对 CSV 的支持包括标准 CSV 和自定义分隔符(如制表符、管道符)。
3.1.1 关键配置参数
| 参数 | 说明 | 默认值 | 优化建议 |
|---|---|---|---|
FileHeaderInfo |
是否包含表头行 | NONE | 建议设为 USE,可引用列名 |
RecordDelimiter |
行分隔符 | \n | 保持默认 |
FieldDelimiter |
列分隔符 | , | 数据中含逗号时改用 | 或 \t |
QuoteCharacter |
引用字符 | " | 字段含分隔符时必用 |
Comments |
注释行标记 | # | 可忽略注释行加速扫描 |
3.1.2 CSV 查询示例
-- 查询 CSV 文件,使用列名引用
SELECT s._1, s._2
FROM s3object s
WHERE s._3 > 100
-- 当 FileHeaderInfo=USE 时,可直接使用列名
SELECT s.order_id, s.amount
FROM s3object s
WHERE s.status = 'completed'
CSV 性能陷阱:CSV 是纯文本格式,S3 Select 必须扫描全部行才能过滤。对于大文件(>100MB),即使只返回 1 行,也需要读取整个文件。建议将大 CSV 文件拆分为 64MB 左右的块,或转换为 Parquet。
3.2 JSON 格式详解
S3 Select 支持两种 JSON 结构:Lines(每行一个独立 JSON 对象)和 Document(单个大型 JSON 文档)。
3.2.1 Lines 模式 vs Document 模式
| 特性 | Lines 模式 | Document 模式 |
|---|---|---|
| 文件结构 | 每行一个 JSON 对象 | 单个 JSON 数组或嵌套对象 |
| 扫描方式 | 逐行扫描,可并行 | 必须解析整个文档 |
| 内存开销 | 低 | 高(需加载全部) |
| 推荐场景 | 日志、事件流 | 配置文件、小数据集 |
| 最大文件建议 | 无限制 | < 256MB |
3.2.2 JSON 查询示例
-- Lines 模式:查询嵌套字段
SELECT s.event_type, s.payload.temperature
FROM s3object s
WHERE s.payload.temperature > 30.0
-- Document 模式:展开数组
SELECT s.items[*].name
FROM s3object s
WHERE s.category = 'electronics'
JSON 性能要点:Lines 模式支持 S3 Select 的并行扫描,性能接近 CSV。Document 模式必须完整解析,仅适合小文件。生产环境建议使用 Lines 模式,且每行 JSON 大小控制在 1MB 以内。
3.3 Parquet 格式详解
Parquet 是列式存储格式,是 S3 Select 性能优化的首选格式。它通过列裁剪、谓词下推、压缩编码实现极致查询性能。
3.3.1 Parquet 核心优势
- 列裁剪:只读取查询涉及的列,跳过无关列数据
- 谓词下推:在读取数据前应用过滤条件,跳过不匹配的行组
- 压缩编码:支持 Snappy、Gzip、LZO,存储空间减少 70-80%
- Schema 自描述:文件内嵌列名、类型、统计信息
- 行组索引:每个行组记录 min/max 值,加速范围查询
3.3.2 Parquet 查询示例
-- Parquet 查询自动利用列裁剪
SELECT order_date, total_amount
FROM s3object s
WHERE s.region = 'APAC'
AND s.total_amount > 1000
-- 聚合查询同样高效
SELECT region, COUNT(*) as cnt, AVG(amount) as avg_amt
FROM s3object s
GROUP BY region
3.3.3 三种格式性能对比
| 维度 | CSV | JSON (Lines) | Parquet |
|---|---|---|---|
| 存储效率 | 低(无压缩) | 中(可压缩) | 高(列式+编码) |
| 扫描数据量 | 全文件 | 全文件 | 仅查询列 |
| 谓词下推 | 不支持 | 不支持 | 支持(行组级别) |
| Schema 类型 | 无类型 | 动态类型 | 强类型 |
| 查询速度(1GB) | ~15s | ~12s | ~2s |
| 适用场景 | 临时分析、导出 | 日志、事件流 | 生产分析、数仓 |
3.4 格式选择决策流程
3.5 格式转换最佳实践
将现有 CSV/JSON 数据转换为 Parquet 可显著提升 S3 Select 性能。推荐使用以下工具链:
- AWS Glue ETL:可视化转换作业,支持增量处理
- Apache Spark:大规模并行转换,适合 TB 级数据
- Amazon Athena CTAS:使用
CREATE TABLE AS SELECT直接转换 - Python + PyArrow:轻量级转换,适合开发环境
-- Athena CTAS 转换示例:CSV → Parquet
CREATE TABLE orders_parquet
WITH (
format = 'PARQUET',
parquet_compression = 'SNAPPY',
external_location = 's3://my-bucket/orders-parquet/'
) AS
SELECT * FROM orders_csv;
性能提升数据:某电商平台将 500GB 的 CSV 日志转换为 Parquet 后,S3 Select 查询延迟从平均 18 秒降至 2.3 秒,扫描数据量减少 85%,月度 S3 Select 费用降低 73%。
3.6 本章小结
- CSV:简单通用,但无类型、无索引,适合小规模临时查询
- JSON:灵活支持嵌套,Lines 模式性能优于 Document 模式
- Parquet:列式存储+谓词下推,S3 Select 性能最优选择
- 转换策略:生产环境优先使用 Parquet,配合 Snappy 压缩