设置 Payload 为 OverwriteNonDefaultsWithLatestAvroPayload:
set `hoodie.datasource.write.payload.class`=`org.apache.hudi.common.model.OverwriteNonDefaultsWithLatestAvroPayload`;
插入和查询语句:
insert into t71 (ds,ut,pk,f0) values (20230101,CURRENT_TIMESTAMP,1001,1);
select * from t71 where pk=1001; -- 第 1 次查询
insert into t71 (ds,ut,pk,f1) values (20230101,CURRENT_TIMESTAMP,1001,2);
select * from t71 where pk=1001; -- 第 2 次查询
insert into t71 (ds,ut,pk,f2) values (20230101,CURRENT_TIMESTAMP,1001,3);
select * from t71 where pk=1001; -- 第 3 次查询
第 1 次查询的结果:
_hoodie_partition_path _hoodie_file_name ut pk f0 f1 f2
ds=20230101 00000001-1521-41de-94a3-96b0b8f4a54f-0_1-21-19_20230529124148552.parquet 2023-05-29 12:41:48.74 1001 1 NULL NULL
第 2 次查询的结果:
_hoodie_partition_path _hoodie_file_name ut pk f0 f1 f2
ds=20230101 00000001-1521-41de-94a3-96b0b8f4a54f-0 2023-05-29 12:46:11.696 1001 1 2 NULL
第 3 次查询的结果:
_hoodie_partition_path _hoodie_file_name ut pk f0 f1 f2
ds=20230101 00000001-1521-41de-94a3-96b0b8f4a54f-0 2023-05-29 12:50:30.234 1001 1 NULL 3
从上测试可以看到第 3 次的插入覆盖了第 2 次的插入,原因是第 2 次的结果还没有落地形成 basefile(基础文件,即 parquet 列式文件),还处于 logfile 状态(日志文件,即行式的 avro 文件),基于 precombine 覆盖了。
Compaction
Hudi 的 MOR 表由列式 Parquet 文件和行式 Avro 文件构成,其中 Avro 是新写入的,为 logfile,而 Parquet 是存储已有的,为 basefile,注意对于 COW 表只有 basefile。如果 Avro 文件过多,查询性能受到的影响就大,通过 compaction 合并 Avro 文件降低影响。
Compaction 又分为两步:调度(schedule)和执行(run)。调度的目的是通过扫描分区,找出要合并的 fileslices,将 compaction 计划写入时间轴(timeline);执行这步读取 compaction 计划和合并 fileslices。
使用 Compaction 分为同步和离线两种:
- 同步 Compaction 设置
hoodie.compact.inline=true
hoodie.compact.inline.max.delta.commits=2
- 离线 Compaction 设置
hoodie.compact.inline=false
hoodie.compact.inline.max.delta.commits=2
离线方式,建议设置 compaction.schedule.enable 为 true,开启由写任务(write task)定期(periodically)触发执行。
基础文件(basefile)
基础文件为列式格式(如 Parquet 或 Orc,默认为 Parquet)的记录集,对于 COW 表只有基础文件。
日志文件(logfile)
日志文件包含了针对基础文件的插入(inserts)、更新(updates)和删除(deletes)数据,日志文件仅 MOR 表有。
_hoodie_file_name
存储记录的文件名。
标签:文件,Hudi,测试,OverwriteNonDefaultsWithLatestAvroPayload,t71,hoodie,pk,ds,1001 From: https://www.cnblogs.com/aquester/p/17442610.html