精进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;同样前者以分区为粒度处理,后者是全局的。

目录
相关文章
|
4月前
|
消息中间件 监控 数据挖掘
基于RabbitMQ与Apache Flink构建实时分析系统
【8月更文第28天】本文将介绍如何利用RabbitMQ作为数据源,结合Apache Flink进行实时数据分析。我们将构建一个简单的实时分析系统,该系统能够接收来自不同来源的数据,对数据进行实时处理,并将结果输出到另一个队列或存储系统中。
286 2
|
1月前
|
存储 SQL Apache
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
|
1月前
|
监控 Cloud Native BI
8+ 典型分析场景,25+ 标杆案例,Apache Doris 和 SelectDB 精选案例集(2024版)电子版上线
飞轮科技正式推出 Apache Doris 和 SelectDB 精选案例集 ——《走向现代化的数据仓库(2024 版)》,汇聚了来自各行各业的成功案例与实践经验。该书以行业为划分标准,辅以使用场景标签,旨在为读者提供一个高度整合、全面涵盖、分类清晰且易于查阅的学习资源库。
|
3月前
|
存储 JSON 物联网
查询性能提升 10 倍、存储空间节省 65%,Apache Doris 半结构化数据分析方案及典型场景
本文我们将聚焦企业最普遍使用的 JSON 数据,分别介绍业界传统方案以及 Apache Doris 半结构化数据存储分析的三种方案,并通过图表直观展示这些方案的优势与不足。同时,结合具体应用场景,分享不同需求场景下的使用方式,帮助用户快速选择最合适的 JSON 数据存储及分析方案。
查询性能提升 10 倍、存储空间节省 65%,Apache Doris 半结构化数据分析方案及典型场景
|
2月前
|
存储 分布式计算 druid
大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
69 3
|
2月前
|
消息中间件 druid 大数据
大数据-153 Apache Druid 案例 从 Kafka 中加载数据并分析(二)
大数据-153 Apache Druid 案例 从 Kafka 中加载数据并分析(二)
41 2
|
2月前
|
消息中间件 分布式计算 druid
大数据-153 Apache Druid 案例 从 Kafka 中加载数据并分析(一)
大数据-153 Apache Druid 案例 从 Kafka 中加载数据并分析(一)
60 1
|
2月前
|
消息中间件 druid Kafka
从Apache Flink到Kafka再到Druid的实时数据传输,用于分析/决策
从Apache Flink到Kafka再到Druid的实时数据传输,用于分析/决策
92 0
|
3月前
|
存储 大数据 数据挖掘
【数据新纪元】Apache Doris:重塑实时分析性能,解锁大数据处理新速度,引爆数据价值潜能!
【9月更文挑战第5天】Apache Doris以其卓越的性能、灵活的架构和高效的数据处理能力,正在重塑实时分析的性能极限,解锁大数据处理的新速度,引爆数据价值的无限潜能。在未来的发展中,我们有理由相信Apache Doris将继续引领数据处理的潮流,为企业提供更快速、更准确、更智能的数据洞察和决策支持。让我们携手并进,共同探索数据新纪元的无限可能!
162 11
|
4月前
|
存储 运维 数据处理
Apache Paimon:重塑阿里智能引擎数据处理新纪元,解锁高效存储与实时分析潜能!
【8月更文挑战第2天】探索 Apache Paimon 在阿里智能引擎的应用场景
222 2

推荐镜像

更多