This is an automated email from the ASF dual-hosted git repository.
danny0405 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hudi.git
The following commit(s) were added to refs/heads/master by this push:
new 59561a8d8c1f test(common): cover array fields in parquet-avro
GenericData reader test (#20190)
59561a8d8c1f is described below
commit 59561a8d8c1fa28ad7fb3da632c0779d9417053d
Author: databird07 <[email protected]>
AuthorDate: Tue Oct 20 19:41:55 2026 -0700
test(common): cover array fields in parquet-avro GenericData reader test
(#20190)
Switching Hudi's parquet-avro readers to the GenericData model changes the
runtime type of Avro array fields: SpecificData resolves an ARRAY schema to
List.class, so parquet-avro materializes java.util.ArrayList, while
GenericData materializes org.apache.avro.generic.GenericData.Array. Both
implement java.util.List, and Hudi's array consumers (HoodieAvroUtils,
ConvertingGenericData, HoodieRealtimeRecordReaderUtils and the Spark
AvroDeserializer) only rely on Collection/List.
Add an array<string> field to TestAvroStringableClassResolution and assert,
for both the HoodieAvroParquetReaderBuilder path and the ParquetUtils path,
that it is read back as a java.util.List with the original elements.
---
.../parquet/avro/TestAvroStringableClassResolution.java | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git
a/hudi-hadoop-common/src/test/java/org/apache/parquet/avro/TestAvroStringableClassResolution.java
b/hudi-hadoop-common/src/test/java/org/apache/parquet/avro/TestAvroStringableClassResolution.java
index 5501b4f91f11..81bf08ddfc3d 100644
---
a/hudi-hadoop-common/src/test/java/org/apache/parquet/avro/TestAvroStringableClassResolution.java
+++
b/hudi-hadoop-common/src/test/java/org/apache/parquet/avro/TestAvroStringableClassResolution.java
@@ -37,11 +37,13 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import java.io.IOException;
+import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
/**
* Verifies that Hudi's parquet-avro readers never instantiate classes named
by the
@@ -66,7 +68,10 @@ class TestAvroStringableClassResolution {
void writeFile() throws IOException {
Schema stringSchema = Schema.create(Schema.Type.STRING);
stringSchema.addProp("java-class", StringableProbe.class.getName());
- Schema schema =
SchemaBuilder.record("rec").fields().name("f").type(stringSchema).noDefault().endRecord();
+ Schema schema = SchemaBuilder.record("rec").fields()
+ .name("f").type(stringSchema).noDefault()
+ .name("a").type().array().items().stringType().noDefault()
+ .endRecord();
filePath = new Path(tempDir.resolve("stringable.parquet").toUri());
try (ParquetWriter<GenericRecord> writer =
AvroParquetWriter.<GenericRecord>builder(filePath)
@@ -76,6 +81,7 @@ class TestAvroStringableClassResolution {
.build()) {
GenericRecord record = new GenericData.Record(schema);
record.put("f", "value");
+ record.put("a", Arrays.asList("x", "y"));
writer.write(record);
}
StringableProbe.INSTANCES.set(0);
@@ -91,6 +97,7 @@ class TestAvroStringableClassResolution {
IndexedRecord record = reader.read();
assertEquals("value", record.get(0).toString());
assertFalse(record.get(0) instanceof StringableProbe);
+ assertArrayField(record.get(1));
}
assertEquals(0, StringableProbe.INSTANCES.get());
}
@@ -103,6 +110,14 @@ class TestAvroStringableClassResolution {
List<GenericRecord> records = new ParquetUtils().readAvroRecords(new
HoodieHadoopStorage(filePath, conf), storagePath);
assertEquals(1, records.size());
assertEquals("value", records.get(0).get("f").toString());
+ assertArrayField(records.get(0).get("a"));
assertEquals(0, StringableProbe.INSTANCES.get());
}
+
+ private static void assertArrayField(Object value) {
+ List<?> list = assertInstanceOf(List.class, value);
+ assertEquals(2, list.size());
+ assertEquals("x", list.get(0).toString());
+ assertEquals("y", list.get(1).toString());
+ }
}