danny0405 commented on code in PR #19665:
URL: https://github.com/apache/hudi/pull/19665#discussion_r3821531974


##########
hudi-common/src/main/java/org/apache/hudi/common/schema/internal/utils/AvroSchemaEvolutionUtils.java:
##########
@@ -332,7 +333,8 @@ public static HoodieSchema 
reconcileSchemaRequirements(HoodieSchema sourceSchema
     List<String> typeUpdateColsInSource = new ArrayList<>();
     colNamesSourceSchema.forEach(field -> {
       // handle columns that needs to be made nullable
-      if (colNamesTargetSchema.contains(field) && 
sourceInternalSchema.findField(field).isOptional() != 
targetInternalSchema.findField(field).isOptional()) {
+      if ((makeNewColumnsNullable && !colNamesTargetSchema.contains(field))

Review Comment:
   Addressed in 8e1ba38b300c. New paths are sorted and tracked with the same 
parent-visited guard used by `reconcileSchema`, which relaxes only the topmost 
field of a wholly new subtree. The regression test adds a new struct and array, 
asserts that each container is nullable with a null default, and asserts that 
the struct field, array element, and element field remain required.



##########
hudi-common/src/main/java/org/apache/hudi/common/schema/internal/utils/AvroSchemaEvolutionUtils.java:
##########
@@ -332,7 +333,8 @@ public static HoodieSchema 
reconcileSchemaRequirements(HoodieSchema sourceSchema
     List<String> typeUpdateColsInSource = new ArrayList<>();
     colNamesSourceSchema.forEach(field -> {
       // handle columns that needs to be made nullable
-      if (colNamesTargetSchema.contains(field) && 
sourceInternalSchema.findField(field).isOptional() != 
targetInternalSchema.findField(field).isOptional()) {
+      if ((makeNewColumnsNullable && !colNamesTargetSchema.contains(field))

Review Comment:
   Addressed in 8e1ba38b300c. New-field and existing-nullability candidates now 
exclude `META_FIELD_NAMES`, so an incoming metadata field is not treated as a 
user schema addition after the table schema has stripped metadata. 
`testMetadataFieldsAreExcludedFromNewColumnNullability` covers 
`_hoodie_commit_time` and verifies that it remains required.



##########
hudi-common/src/main/java/org/apache/hudi/common/config/HoodieCommonConfig.java:
##########
@@ -77,11 +77,14 @@ public class HoodieCommonConfig extends HoodieConfig {
   public static final ConfigProperty<String> SET_NULL_FOR_MISSING_COLUMNS = 
ConfigProperty
       .key("hoodie.write.set.null.for.missing.columns")
       .defaultValue("false")
+      .withAlternatives("hoodie.datasource.write.new.columns.nullable")

Review Comment:
   Agreed and addressed in 8e1ba38b300c. I removed the compatibility alias and 
all coupling to `hoodie.write.set.null.for.missing.columns`. Newly evolved 
fields are made nullable by default during canonicalization, while that config 
remains limited to existing table columns missing from the incoming batch. The 
functional test now runs without either null-backfill key in both 
schema-on-read modes.



##########
hudi-common/src/main/java/org/apache/hudi/common/schema/internal/utils/AvroSchemaEvolutionUtils.java:
##########
@@ -363,5 +365,9 @@ public static HoodieSchema 
reconcileSchemaRequirements(HoodieSchema sourceSchema
 
     return 
convert(SchemaChangeUtils.applyTableChanges2Schema(sourceInternalSchema, 
schemaChange), sourceSchema.getFullName());
   }
-}
 
+  public static HoodieSchema reconcileSchemaRequirements(HoodieSchema 
sourceSchema, HoodieSchema targetSchema,

Review Comment:
   Addressed in 8e1ba38b300c. After separating new-field evolution from the 
missing-column config, the temporary four-argument overload is no longer needed 
and has been removed. The original three-argument method is again the single 
API, so the caller/callee ordering issue is eliminated.



-- 
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]

Reply via email to