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());
+  }
 }

Reply via email to