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 格式选择决策流程

S3 Select 格式选择决策流程 数据源分析 Schema 是否固定? 是 否 Parquet 列式存储,高性能 JSON / CSV 灵活但性能较低 行组大小优化 64MB-256MB 文件拆分 每文件 < 256MB 性能测试验证 使用 S3 Select 基准测试 优先选择 Parquet 可节省 70-90% 扫描量

3.5 格式转换最佳实践

将现有 CSV/JSON 数据转换为 Parquet 可显著提升 S3 Select 性能。推荐使用以下工具链:

  1. AWS Glue ETL:可视化转换作业,支持增量处理
  2. Apache Spark:大规模并行转换,适合 TB 级数据
  3. Amazon Athena CTAS:使用 CREATE TABLE AS SELECT 直接转换
  4. 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 压缩