










请关注微信公众号:阿呆-bot
Hudi 支持多种文件格式来存储数据,不同的格式有不同的特点和适用场景。理解文件格式的选择和使用,有助于优化存储和查询性能。
Hudi 主要使用两种文件格式:
另外还支持 ORC 作为基础文件的替代选择,以及 HFile 用于元数据表。
Parquet 是列式存储格式,特别适合分析型查询。Hudi 使用 Parquet 作为基础文件的默认格式。
Parquet 的特点:
在 Hudi 中的使用:
{fileId}_{commitTime}.parquetAvro 是行式存储格式,特别适合增量写入。Hudi 使用 Avro 作为增量日志的格式。
Avro 的特点:
在 Hudi 中的使用:
ORC(Optimized Row Columnar)是另一种列式存储格式,可以作为 Parquet 的替代。
ORC 的特点:
在 Hudi 中的使用:
hoodie.table.base.file.format=ORC 启用HFile 是 HBase 的文件格式,Hudi 用它来存储元数据表。
HFile 的特点:
在 Hudi 中的使用:
Hudi 根据表类型选择文件格式:
Copy-on-Write 表:
Merge-on-Read 表:
Hudi 通过 HoodieIOFactory 来获取不同格式的读写器:
这些工具类封装了格式特定的读写逻辑。
Hudi 支持 Schema 演化,可以在不重写数据的情况下添加新列:
Schema 演化时,旧数据的新列会使用默认值。
不同格式使用不同的压缩和编码策略:
压缩算法的选择影响压缩率和压缩速度。

下面是一个文件读取操作的时序图,展示了如何读取 Parquet 基础文件和 Avro 日志文件:

// 获取 IO 工厂
HoodieIOFactory ioFactory = HoodieIOFactory.getIOFactory(storage);
// 获取 Parquet 格式工具
FileFormatUtils parquetUtils = ioFactory.getFileFormatUtils(HoodieFileFormat.PARQUET);
// 读取基础文件
HoodieBaseFile baseFile = fileSlice.getBaseFile().get();
List<HoodieRecord> records = parquetUtils.deserializeRecordsFromLogBlock(
storage,
baseFile.getPath(),
schema
);
// 获取 Avro 格式工具
FileFormatUtils avroUtils = ioFactory.getFileFormatUtils(HoodieFileFormat.HOODIE_LOG);
// 序列化记录到日志块
ByteArrayOutputStream outputStream = avroUtils.serializeRecordsToLogBlock(
storage,
records,
schema,
keyFieldName,
paramsMap
);
// 写入日志文件
HoodieLogFileWriter writer = HoodieLogFormat.newWriterBuilder()
.withStorage(storage)
.withLogFile(logFile)
.build();
writer.appendBlock(outputStream.toByteArray());
// 配置基础文件格式为 ORC
HoodieWriteConfig config = HoodieWriteConfig.newBuilder()
.withPath(basePath)
.withBaseFileFormat(HoodieFileFormat.ORC)
.build();
Hudi 支持多种文件格式,每种格式都有其适用场景。核心要点:
理解文件格式有助于优化 Hudi 表的存储和查询性能,选择合适的格式可以显著提升系统效率。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。