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