spark-parquet列存储之:数据写入过程源码分析

本文深入分析了Spark使用Parquet进行数据写入的过程,包括initStore阶段、数据写入准备阶段、writeSupport写入数据阶段以及检查和Flush阶段。在initStore阶段,初始化MessageColumnIO并准备schema信息;数据写入准备阶段则为实际写入操作做铺垫;writeSupport阶段涉及数据的实际写入;最后的检查和Flush阶段确保数据正确性和完整性的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据写入过程源码分析

数据写入过程

构造ParquetRecordWriter时构造InternalParquetRecordWriter
public ParquetRecordWriter(
...){
 internalWriter = new InternalParquetRecordWriter<T>(w, writeSupport, schema,
        extraMetaData, blockSize, pageSize, compressor, dictionaryPageSize, enableDictionary, validating, writerVersion);
}
构造InternalParquetRecordWriter时触发initStore
public InternalParquetRecordWriter(
...
initStore()
...)
执行ParquetRecordWriter.write时,执行InternalParquetRecordWriter.write
  public void write(Void key, T value) throws IOException, InterruptedException {
    internalWriter.write(value);
  }
InternalParquetRecordWriter.write方法实现如下:
  public void write(T value) throws IOException, InterruptedException {
    writeSupport.write(value);
    ++ recordCount;
    checkBlockSizeReached();
  }

因此,数据写入过程大致分为四个阶段:initStore阶段,数据写入准备阶段,writeSupport写入数据阶段,检查和flush阶段

initStore阶段

 int initialBlockBufferSize = max(MINIMUM_BUFFER_SIZE, rowGroupSize / schema.getColumns().size() / 5);
 int initialPageBufferSize = max(MINIMUM_BUFFER_SIZE, min(pageSize + pageSize / 10, initialBlockBufferSize));
初始化BlockBufferSize和PageBufferSize
pageStore = new ColumnChunkPageWriteStore(compressor, schema, initialBlockBufferSize);
columnStore = new ColumnWriteStoreImpl(pageStore, pageSize, initialPageBufferSize, dictionaryPageSize, enableDictionary, writerVersion);
初始化pageSWritertore和ColumWriterStore,分别含有PageWriter和ColumnWriter内部类进行数据写入操作

数据写入准备阶段

    MessageColumnIO columnIO = new ColumnIOFactory(validating).getColumnIO(schema);
    writeSupport.prepareForWrite(columnIO.getRecordWriter(columnStore));

初始化MessageColumnIO,传递schema信息,为数据写入做准备

validating值在ParquetRecordWrite初始化时被确定,默认为false,如下代码所示


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值