1. Write Operation类型
类型如下:
- upsert(默认):先查找索引,然后再进行insert或update
- insert:不查找索引,直接insert
- bulk_insert:对于表初始化时,进行几百TB数据的insert。数据insert时会进行排序
- delete
- Soft Deletes:删除一条数据的时候,保留数据,但将其它字段设置为null
- Hard Deletes:进行physically remove,由3种实现方式:
- 通过DataSource:设置OPERATION_OPT_KEY为DELETE_OPERATION_OPT_VAL,对submit的dataset进行删除
- 通过DataSource:设置PAYLOAD_CLASS_OPT_KEY为"org.apache.hudi.EmptyHoodieRecordPayload",对submit的dataset进行删除
- 通过DataSource或DeltaStreamer:向dataset添加一列
_hoodie_is_deleted
,值为true表示delete,值为false或null表示upsert
write的流程:
- Index Lookup:看record属于哪个file group
- Partitioning:决定update / insert哪些file group,或创建哪些file group
- Write I/O:创建新的base file,或append到log file
- Update Index
- Commit:进行原子性的commit,如果失败则rollback
- Clean(if needed)
- Compaction:如果是MOR类型的表, 同步或异步的进行compaction
- Archive:将timeline中老的移动到archive文件夹
2. Schema Evolution
下表是schema changes对不同Hudi表的兼容情况
Schema Change | COW | MOR | Remarks |
---|---|---|---|
添加一个nullable列到schema的最后 | Yes | Yes | |
添加一个nullable列到struct类型字段的最后 | Yes | Yes | |
Add a new complex type field with default (map and array) | Yes | Yes | |
添加一个nullable的Hudi meta column,比如:_hoodie_meta_col | Yes | Yes | |
将root level字段的类型从int升到long | Yes | Yes | 还支持其它类型提升:int => long、float、double,long => float、double,float => double,string => bytes,bytes => string |
将嵌套类型字段的子字段从int升到long | Yes | Yes | |
Promote datatype from int to long for a complex type (value of map or array) | Yes | Yes |