hudi+flink在非schema on read模式下也表现出了支持一部分的schema evolution功能,本篇中测试一下在非schema on read模式下,发生各种列变更情况时数据写入与读取情况。
- flink 1.14.5
- hudi 0.13.1
- mor表
思路:
- 选择mor表是因为它的数据文件有avro和parquet两种格式,能覆盖得更全面,相对于cow表,两者在parquet上的读取共用了低层实现(
RecordIterators.getParquetRecordIterator
),所以两者表现应该是一致的。 - 模式变更前后分别写入一条数据,用变更后的模式读取所有数据
- 测试parquet读:insert模式下使用两条数据写入不同的parquet文件,进行eartlist的增量读。如果采用compaction生成parquet,新旧数据需要分别compact到不同文件(一个parquet对应一个schema),否则旧数据会自动在compact过程中进行了evolve,可将数据写到不同分区。
- 只读arvo:upsert模式使两次写入均生成arvo文件,进行eartlist的增量读。即使写到同一个文件,但是两次写入对应不同的block,有各自的schema.
追加列
- 模式变更前:<id int, name string, create_date string>,数据(1,‘1’,‘2023-07-25’)
- 模式变更后:<id int, name string, create_date string, col1 int>,数据(2,‘2’,‘2