HoodieKeyLookupHandle#getLookupResult方法核心代码如下
public KeyLookupResult getLookupResult() { ... HoodieDataFile dataFile = getLatestDataFile(); List<String> matchingKeys = checkCandidatesAgainstFile(hoodieTable.getHadoopConf(), candidateRecordKeys, new Path(dataFile.getPath())); ... return new KeyLookupResult(partitionPathFilePair.getRight(), partitionPathFilePair.getLeft(), dataFile.getCommitTime(), matchingKeys); }该方法首先获取指定分区下的最新数据文件,然后判断数据文件存在哪些recordKey,并将其封装进KeyLookupResult后返回。其中#checkCandidatesAgainstFile会读取文件中所有的recordKey,判断是否存在于candidateRecordKeys,这便完成了进一步确认。
到这里即完成了record存在于哪些文件的所有查找,查找完后会进行进一步处理,后续再给出分析。
总结Hudi引入Bloom Filter是为了加速upsert过程,并将其存入parquet数据文件中的Footer中,在读取文件时会从Footer中读取该BloomFilter。在利用Bloom Filter来判断记录是否存在时,会采用二次确认的方式规避Bloom Filter的误判问题。