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

目录
相关文章
|
5天前
|
存储 Apache
Apache Hudi Savepoint实现分析
Apache Hudi Savepoint实现分析
42 0
|
5天前
|
Apache
Apache Hudi Rollback实现分析
Apache Hudi Rollback实现分析
27 0
|
5天前
|
存储 SQL 分布式计算
使用Amazon EMR和Apache Hudi在S3上插入,更新,删除数据
使用Amazon EMR和Apache Hudi在S3上插入,更新,删除数据
150 0
|
5天前
|
存储 分布式计算 Hadoop
一文了解Apache Hudi架构、工具和最佳实践
一文了解Apache Hudi架构、工具和最佳实践
155 0
|
5天前
|
SQL 分布式计算 NoSQL
使用Apache Hudi和Debezium构建健壮的CDC管道
使用Apache Hudi和Debezium构建健壮的CDC管道
22 0
|
5天前
|
存储 SQL 消息中间件
Apache Hudi:统一批和近实时分析的存储和服务
Apache Hudi:统一批和近实时分析的存储和服务
45 0
|
2天前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版操作报错合集之遇到报错:Apache Kafka Connect错误如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
13 5
|
2天前
|
SQL 关系型数据库 MySQL
实时计算 Flink版操作报错合集之报错:org.apache.flink.table.api.validationexception如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
11 1
|
2天前
|
存储 SQL 关系型数据库
实时计算 Flink版操作报错合集之报错:WARN (org.apache.kafka.clients.consumer.ConsumerConfig:logUnused)这个错误如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
13 3
|
5天前
|
消息中间件 API Apache
官宣|阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会
本文整理自阿里云开源大数据平台徐榜江 (雪尽),关于阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会。
1810 2
官宣|阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会

热门文章

最新文章

推荐镜像

更多