wgtmac commented on code in PR #3753:
URL: https://github.com/apache/parquet-java/pull/3753#discussion_r3921973251


##########
parquet-avro/src/main/java/org/apache/parquet/avro/AvroReadSupport.java:
##########
@@ -128,6 +136,18 @@ public ReadContext init(
     MessageType projection = fileSchema;
     Map<String, String> metadata = new LinkedHashMap<String, String>();
 
+    boolean autoDetectListStructure =
+        configuration.getBoolean(AUTO_DETECT_LIST_STRUCTURE, 
AUTO_DETECT_LIST_STRUCTURE_DEFAULT);
+
+    if (autoDetectListStructure
+        && configuration.get(AvroWriteSupport.WRITE_OLD_LIST_STRUCTURE) == null
+        && configuration.get(AvroSchemaConverter.ADD_LIST_ELEMENT_RECORDS) == 
null) {
+      if (writesNewListStructure(fileSchema)) {
+        configuration.setBoolean(AvroWriteSupport.WRITE_OLD_LIST_STRUCTURE, 
false);

Review Comment:
   This writes the inferred mode back into the shared Configuration. 
ParquetReader reuses that configuration across files, so after a 3-level file, 
a later 2-level file (especially with a projection) is still converted as 
3-level. Could this stay per-file/read-context instead of mutating the caller's 
configuration?



##########
parquet-avro/src/main/java/org/apache/parquet/avro/AvroReadSupport.java:
##########
@@ -128,6 +136,18 @@ public ReadContext init(
     MessageType projection = fileSchema;
     Map<String, String> metadata = new LinkedHashMap<String, String>();
 
+    boolean autoDetectListStructure =
+        configuration.getBoolean(AUTO_DETECT_LIST_STRUCTURE, 
AUTO_DETECT_LIST_STRUCTURE_DEFAULT);
+
+    if (autoDetectListStructure
+        && configuration.get(AvroWriteSupport.WRITE_OLD_LIST_STRUCTURE) == null

Review Comment:
   Is it a good time to make a shift on the default value of 
`AvroWriteSupport.WRITE_OLD_LIST_STRUCTURE`? It has caused a lot of troubles.



##########
parquet-avro/src/main/java/org/apache/parquet/avro/AvroReadSupport.java:
##########
@@ -230,4 +250,39 @@ private GenericData getDataModel(ParquetConfiguration 
conf, Schema schema) {
     return ReflectionUtils.newInstance(suppClass, 
ConfigurationUtil.createHadoopConfiguration(conf))
         .get();
   }
+
+  private static boolean writesNewListStructure(MessageType schema) {
+    return Boolean.TRUE.equals(allListStructuresAreThreeLevel(schema));
+  }
+
+  // Given a Parquet schema, return true only if the schema:
+  // - contains one or more List fields
+  // - encodes every List field using 3-level list structure
+  private static Boolean allListStructuresAreThreeLevel(Type type) {
+    if (type.isPrimitive()) {
+      return null;
+    }
+    GroupType group = type.asGroupType();
+    if (group.getLogicalTypeAnnotation() instanceof 
LogicalTypeAnnotation.ListLogicalTypeAnnotation) {
+      if (group.getFieldCount() != 1) {
+        return false;
+      }
+      Type repeated = group.getType(0);
+      return !repeated.isPrimitive()

Review Comment:
   I may be misremembering the LIST compatibility rules, so I wanted to check 
this edge case: could a legacy 2-level list also use the `list`/`element` names 
and therefore look like this to `allListStructuresAreThreeLevel`? If so, would 
auto-detect change its Avro shape unexpectedly, or is this case ruled out by 
the spec or writer assumptions?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to