hudi-client/src/main/java/org/apache/hudi/index/bloom/HoodieBloomIndex.java
/**
   * For each incoming record, produce N output records, 1 each for each file against which the record's key needs to be
   * checked. For tables, where the keys have a definite insert order (e.g: timestamp as prefix), the number of files
   * to be compared gets cut down a lot from range pruning.
   * <p>
   * Sub-partition to ensure the records can be looked up against files & also prune file<=>record comparisons based on
   * recordKey ranges in the index info.
   */
For each incoming record, produce N output records, 1 each for each file against which the record's key needs to be
checked. For tables, where the keys have a definite insert order , the number of files
to be compared gets cut down a lot from range pruning.

Sub-partition to ensure the records can be looked up against files & also prune file<=>record comparisons based on
recordKey ranges in the index info.
For each incoming record produce N output records 1 each for each file against which the record ' s key needs to be checked . For tables where the keys have a definite insert order the number of files to be compared gets cut down a lot from range pruning . Sub - partition to ensure the records can be looked up against files & also prune file< = > record comparisons based on recordKey ranges in the index info .
JavaRDD<Tuple2<String, HoodieKey>> explodeRecordRDDWithFileComparisons(
      final Map<String, List<BloomIndexFileInfo>> partitionToFileIndexInfo,
      JavaPairRDD<String, String> partitionRecordKeyPairRDD) {
    IndexFileFilter indexFileFilter =
        config.useBloomIndexTreebasedFilter() ? new IntervalTreeBasedIndexFileFilter(partitionToFileIndexInfo)
            : new ListBasedIndexFileFilter(partitionToFileIndexInfo);
    return partitionRecordKeyPairRDD.map(partitionRecordKeyPair -> {
      String recordKey = partitionRecordKeyPair._2();
      String partitionPath = partitionRecordKeyPair._1();
      return indexFileFilter.getMatchingFilesAndPartition(partitionPath, recordKey).stream()
          .map(partitionFileIdPair -> new Tuple2<>(partitionFileIdPair.getRight(),
              new HoodieKey(recordKey, partitionPath)))
          .collect(Collectors.toList());
    }).flatMap(List::iterator);
  }
JavaRDD < Tuple2 < String , HoodieKey > > explodeRecordRDDWithFileComparisons ( final Map < String , List < BloomIndexFileInfo > > partitionToFileIndexInfo , JavaPairRDD < String , String > partitionRecordKeyPairRDD ) { IndexFileFilter indexFileFilter = config . useBloomIndexTreebasedFilter ( ) ? new IntervalTreeBasedIndexFileFilter ( partitionToFileIndexInfo ) : new ListBasedIndexFileFilter ( partitionToFileIndexInfo ) ; return partitionRecordKeyPairRDD . map ( partitionRecordKeyPair -> { String recordKey = partitionRecordKeyPair . _2 ( ) ; String partitionPath = partitionRecordKeyPair . _1 ( ) ; return indexFileFilter . getMatchingFilesAndPartition ( partitionPath , recordKey ) . stream ( ) . map ( partitionFileIdPair -> new Tuple2 < > ( partitionFileIdPair . getRight ( ) , new HoodieKey ( recordKey , partitionPath ) ) ) . collect ( Collectors . toList ( ) ) ; } ) . flatMap ( List :: iterator ) ; }
For each incoming record, produce N output records, 1 each for each file against which the record's key needs to be
 checked.
For each incoming record produce N output records 1 each for each file against which the record ' s key needs to be checked .