[HUDI-4192] HoodieHFileReader scan top cells after bottom cells throw NullPointerException (#5755)
SeekTo top cells avoid NullPointerException
This commit is contained in:
@@ -294,6 +294,38 @@ public class TestHoodieHFileReaderWriter extends TestHoodieReaderWriterBase {
|
|||||||
StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
|
StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
assertEquals(Collections.emptyList(), recordsByPrefix);
|
assertEquals(Collections.emptyList(), recordsByPrefix);
|
||||||
|
|
||||||
|
// filter for "key50" and "key1" : entries from key50 and 'key10 to key19' should be matched.
|
||||||
|
List<GenericRecord> expectedKey50and1s = allRecords.stream().filter(entry -> (entry.get("_row_key").toString()).contains("key1")
|
||||||
|
|| (entry.get("_row_key").toString()).contains("key50")).collect(Collectors.toList());
|
||||||
|
iterator =
|
||||||
|
hfileReader.getRecordsByKeyPrefixIterator(Arrays.asList("key50", "key1"), avroSchema);
|
||||||
|
recordsByPrefix =
|
||||||
|
StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
assertEquals(expectedKey50and1s, recordsByPrefix);
|
||||||
|
|
||||||
|
// filter for "key50" and "key0" : entries from key50 and 'key00 to key09' should be matched.
|
||||||
|
List<GenericRecord> expectedKey50and0s = allRecords.stream().filter(entry -> (entry.get("_row_key").toString()).contains("key0")
|
||||||
|
|| (entry.get("_row_key").toString()).contains("key50")).collect(Collectors.toList());
|
||||||
|
iterator =
|
||||||
|
hfileReader.getRecordsByKeyPrefixIterator(Arrays.asList("key50", "key0"), avroSchema);
|
||||||
|
recordsByPrefix =
|
||||||
|
StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
assertEquals(expectedKey50and0s, recordsByPrefix);
|
||||||
|
|
||||||
|
// filter for "key1" and "key0" : entries from 'key10 to key19' and 'key00 to key09' should be matched.
|
||||||
|
List<GenericRecord> expectedKey1sand0s = expectedKey1s;
|
||||||
|
expectedKey1sand0s.addAll(allRecords.stream()
|
||||||
|
.filter(entry -> (entry.get("_row_key").toString()).contains("key0"))
|
||||||
|
.collect(Collectors.toList()));
|
||||||
|
iterator =
|
||||||
|
hfileReader.getRecordsByKeyPrefixIterator(Arrays.asList("key1", "key0"), avroSchema);
|
||||||
|
recordsByPrefix =
|
||||||
|
StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
assertEquals(expectedKey1sand0s, recordsByPrefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ParameterizedTest
|
@ParameterizedTest
|
||||||
|
|||||||
@@ -258,6 +258,12 @@ public class HoodieHFileReader<R extends IndexedRecord> implements HoodieFileRea
|
|||||||
if (!scanner.next()) {
|
if (!scanner.next()) {
|
||||||
return Collections.emptyIterator();
|
return Collections.emptyIterator();
|
||||||
}
|
}
|
||||||
|
} else if (val == -1) {
|
||||||
|
// If scanner is aleady on the top of hfile. avoid trigger seekTo again.
|
||||||
|
Option<Cell> headerCell = Option.fromJavaOptional(scanner.getReader().getFirstKey());
|
||||||
|
if (headerCell.isPresent() && !headerCell.get().equals(scanner.getCell())) {
|
||||||
|
scanner.seekTo();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class KeyPrefixIterator implements Iterator<GenericRecord> {
|
class KeyPrefixIterator implements Iterator<GenericRecord> {
|
||||||
|
|||||||
Reference in New Issue
Block a user