精进Hudi系列|Apache Hudi索引实现分析(五)之基于List的IndexFileFilter

简介: 精进Hudi系列|Apache Hudi索引实现分析(五)之基于List的IndexFileFilter

1. 介绍

前面分析了基于Tree的索引过滤器的实现,Hudi来提供了基于List的索引过滤器的实现:ListBasedIndexFileFilter和ListBasedGlobalIndexFileFilter,下面进行分析。

2. 分析

ListBasedIndexFileFilterListBasedGlobalIndexFileFilter的父类,两者实现了IndexFilter接口的 getMatchingFilesAndPartition方法。

2.1 ListBasedIndexFileFilter实现

ListBasedIndexFileFiltergetMatchingFilesAndPartition方法核心代码如下

public Set<Pair<String, String>> getMatchingFilesAndPartition(String partitionPath, String recordKey) {
    // 获取分区对应的列表
    List<BloomIndexFileInfo> indexInfos = partitionToFileIndexInfo.get(partitionPath);
    Set<Pair<String, String>> toReturn = new HashSet<>();
    if (indexInfos != null) { // 可能为null,即当分区路径下无文件时
      // 遍历列表
      for (BloomIndexFileInfo indexInfo : indexInfos) {
        if (shouldCompareWithFile(indexInfo, recordKey)) { // 判断是否已经比较
          toReturn.add(Pair.of(partitionPath, indexInfo.getFileId()));
        }
      }
    }
    return toReturn;
  }

可以看到该方法的逻辑非常简单,遍历分区对应的BloomIndexFileIndex列表,若判断需要比较则返回,其中 shouldCompareWithFile方法核心代码如下

protected boolean shouldCompareWithFile(BloomIndexFileInfo indexInfo, String recordKey) {
    // 无最大最小recordKey或者指定recordKey在最大最小recordKey之间
    return !indexInfo.hasKeyRanges() || indexInfo.isKeyInRange(recordKey);
  }

是否需要比较的逻辑也很简单,若无最大最小值则需要比较,或者指定recordKey在最大最小值之间也需要比较。

2.2 ListBasedGlobalIndexFileFilter实现

ListBasedIndexFileFiltergetMatchingFilesAndPartition方法核心代码如下

public Set<Pair<String, String>> getMatchingFilesAndPartition(String partitionPath, String recordKey) {
    Set<Pair<String, String>> toReturn = new HashSet<>();
    // 遍历集合
    partitionToFileIndexInfo.forEach((partition, bloomIndexFileInfoList) -> bloomIndexFileInfoList.forEach(file -> {
      if (shouldCompareWithFile(file, recordKey)) { // 判断是否需要比较
        toReturn.add(Pair.of(partition, file.getFileId()));
      }
    }));
    return toReturn;
  }

可以看到入参中的partitionPath不再起作用,直接遍历整个集合。

3. 总结

ListBasedIndexFileFilterListBasedGlobalIndexFileFilter是基于List的索引过滤器,前者也主要用于 HoodieBloomIndex,后者主要用于 HoodieGlobalBloomIndex;同样前者以分区为粒度处理,后者是全局的。

目录
打赏
0
0
0
0
40
分享
相关文章
Aipy实战:分析apache2日志中的网站攻击痕迹
Apache2日志系统灵活且信息全面,但安全分析、实时分析和合规性审计存在较高技术门槛。为降低难度,可借助AI工具如aipy高效分析日志,快速发现攻击痕迹并提供反制措施。通过结合AI与学习技术知识,新手运维人员能更轻松掌握复杂日志分析任务,提升工作效率与技能水平。
为什么 Apache Doris 是比 Elasticsearch 更好的实时分析替代方案?
本文将从技术选型的视角,从开放性、系统架构、实时写入、实时存储、实时查询等多方面,深入分析 Apache Doris 与 Elasticsearch 的能力差异及性能表现
为什么 Apache Doris 是比 Elasticsearch 更好的实时分析替代方案?
Apache Kafka流处理实战:构建实时数据分析应用
【10月更文挑战第24天】在当今这个数据爆炸的时代,能够快速准确地处理实时数据变得尤为重要。无论是金融交易监控、网络行为分析还是物联网设备的数据收集,实时数据处理技术都是不可或缺的一部分。Apache Kafka作为一款高性能的消息队列系统,不仅支持传统的消息传递模式,还提供了强大的流处理能力,能够帮助开发者构建高效、可扩展的实时数据分析应用。
363 5
【Azure Blob】操作Blob之分页List Blob一致性、索引时延及Tag支持问题解答
在使用Azure SDK开发时,遇到以下几个问题: 1. 分页list blob是一个一致性事务级的操作吗?在这个过程中,文件的创建、更新、删除会对分页获取的list blob列表产生什么影响? 2. 文档《响应中的标记》中描述索引是最终一致性,这个过程的时延是多久(更新Tag后大概多长时间可以通过FindBlobByTag查询到)? 3. 所有Blob都支持Tag吗?Block Tag使用上有哪些场景限制?
104 14
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
8+ 典型分析场景,25+ 标杆案例,Apache Doris 和 SelectDB 精选案例集(2024版)电子版上线
飞轮科技正式推出 Apache Doris 和 SelectDB 精选案例集 ——《走向现代化的数据仓库(2024 版)》,汇聚了来自各行各业的成功案例与实践经验。该书以行业为划分标准,辅以使用场景标签,旨在为读者提供一个高度整合、全面涵盖、分类清晰且易于查阅的学习资源库。
Apache Paimon 是一款高性能的数据湖框架,支持流式和批处理,适用于实时数据分析
【10月更文挑战第8天】随着数据湖技术的发展,越来越多企业开始利用这一技术优化数据处理。Apache Paimon 是一款高性能的数据湖框架,支持流式和批处理,适用于实时数据分析。本文分享了巴别时代在构建基于 Paimon 的 Streaming Lakehouse 的探索和实践经验,包括示例代码和实际应用中的优势与挑战。
306 1
大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
169 3
大数据-153 Apache Druid 案例 从 Kafka 中加载数据并分析(二)
大数据-153 Apache Druid 案例 从 Kafka 中加载数据并分析(二)
121 2
大数据-153 Apache Druid 案例 从 Kafka 中加载数据并分析(一)
大数据-153 Apache Druid 案例 从 Kafka 中加载数据并分析(一)
138 1

热门文章

最新文章

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问