从实时分析到数据归档:Apache Druid Parquet/CSV格式导出全指南
你是否还在为Apache Druid(德鲁伊)的数据导出发愁?报表系统需要CSV格式的历史数据?数据湖要求Parquet格式的批量导入?本文将带你通过3个实用场景,掌握从Druid导出Parquet/CSV文件的完整流程,解决实时分析数据落地的最后一公里问题。读完本文,你将获得:Parquet/CSV两种格式的导出方案、嵌套数据处理技巧、性能优化参数配置,以及完整的操作示例。
导出方案概览
Apache Druid作为高性能实时分析数据库,原生支持多种数据导入格式,但数据导出功能需要通过查询结果落地实现。目前主流的导出方案有两种:通过SQL查询接口导出CSV格式,或使用Multi-Stage Query(MSQ)任务生成Parquet文件。两种方案的对比数据如下:
| 格式 | 适用场景 | 工具依赖 | 最大文件大小 | 嵌套数据支持 |
|---|---|---|---|---|
| CSV | 小批量报表导出 | 内置SQL接口 | 依赖查询超时设置 | 需手动扁平化 |
| Parquet | 大数据量归档 | MSQ扩展 | 支持TB级数据分片 | 原生支持 |
官方文档:数据格式说明
CSV格式导出实操
基础SQL导出
通过Druid的SQL接口执行SELECT查询,添加FORMAT参数指定CSV输出格式:
SELECT timestamp, page, added, deleted
FROM "wikipedia"
WHERE "__time" BETWEEN TIMESTAMP '2023-01-01' AND TIMESTAMP '2023-01-02'
FORMAT CSV
执行该查询后,可通过HTTP响应直接获取CSV文件。对于包含表头的需求,可添加HEADER选项:
SELECT timestamp, page, added, deleted
FROM "wikipedia"
FORMAT CSV HEADER
处理嵌套JSON数据
当导出包含嵌套字段的数据时,需使用JSON_VALUE函数提取嵌套属性。例如,导出包含用户地理位置信息的CSV:
SELECT
timestamp,
page,
JSON_VALUE(geo, '$.country') AS country,
JSON_VALUE(geo, '$.city') AS city,
added,
deleted
FROM "wikipedia"
FORMAT CSV HEADER
导出结果示例:
timestamp,page,country,city,added,deleted
2023-01-01T00:00:00Z,"首页","中国","北京",156,23
Parquet格式导出方案
启用MSQ扩展
Parquet导出依赖Druid的Multi-Stage Query功能,需先在common.runtime.properties中启用扩展:
druid.extensions.loadList=["druid-multi-stage-query", "druid-parquet-extensions"]
扩展模块路径:extensions-core/multi-stage-query/、extensions-core/parquet-extensions/
创建Parquet导出任务
使用MSQ任务将数据导出到Deep Storage(深度存储),支持S3、HDFS或本地文件系统。以下是导出Parquet文件的任务示例:
{
"type": "query",
"query": {
"sql": "COPY (SELECT timestamp, page, language, added, deleted FROM wikipedia WHERE __time BETWEEN '2023-01-01' AND '2023-01-02') TO 'deepstorage://bucket/druid-exports/wikipedia-2023-01' FORMAT PARQUET WITH (compression='SNAPPY')"
}
}
提交任务:通过Druid控制台提交或使用curl命令:
curl -X POST -H "Content-Type: application/json" -d @export-parquet.json http://localhost:8081/druid/v2/sql/task
任务状态监控可通过Overlord节点查看:http://localhost:8090/console.html
高级配置与优化
嵌套数据处理
Parquet格式原生支持嵌套结构,通过flattenSpec配置可保留数据层次。例如处理包含用户信息的嵌套JSON:
"flattenSpec": {
"useFieldDiscovery": true,
"fields": [
{
"type": "path",
"name": "user_info",
"expr": "$.user"
}
]
}
配置示例来源:docs/ingestion/data-formats.md
性能优化参数
| 参数 | 说明 | 建议值 |
|---|---|---|
| maxRowsPerFile | 单个文件最大行数 | 1000000 |
| compression | 压缩算法 | SNAPPY(Parquet),GZIP(CSV) |
| partitionSpec | 分区字段 | 按__time分桶 |
常见问题解决
导出任务失败
若任务报"ParquetWriter not found"错误,检查是否加载parquet扩展:
druid.extensions.loadList=["druid-parquet-extensions"]
扩展配置文档:docs/configuration/extensions.md
时间格式处理
导出时指定时间格式,避免默认时间戳格式:
SELECT TIME_FORMAT(timestamp, 'yyyy-MM-dd HH:mm:ss') AS dt, page FROM wikipedia
总结与展望
本文介绍了Apache Druid导出Parquet/CSV格式的两种方案:SQL接口适合小批量CSV导出,MSQ任务适合大规模Parquet归档。随着Druid 27.0版本发布,官方计划推出更完善的EXPORT语法,简化数据导出流程。建议收藏本文,关注docs/ingestion/data-formats.md获取最新更新。
点赞+收藏+关注,不错过 Druid 数据处理技巧!下期预告:《Druid与Apache Iceberg数据湖集成方案》。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



