syun64 commented on code in PR #921:
URL: https://github.com/apache/iceberg-python/pull/921#discussion_r1676465583
##########
pyiceberg/io/pyarrow.py:
##########
@@ -2079,36 +2083,63 @@ def _check_schema_compatible(table_schema: Schema,
other_schema: pa.Schema, down
Raises:
ValueError: If the schemas are not compatible.
"""
- name_mapping = table_schema.name_mapping
- try:
- task_schema = pyarrow_to_schema(
- other_schema, name_mapping=name_mapping,
downcast_ns_timestamp_to_us=downcast_ns_timestamp_to_us
- )
- except ValueError as e:
- other_schema = _pyarrow_to_schema_without_ids(other_schema,
downcast_ns_timestamp_to_us=downcast_ns_timestamp_to_us)
- additional_names = set(other_schema.column_names) -
set(table_schema.column_names)
- raise ValueError(
- f"PyArrow table contains more columns: {',
'.join(sorted(additional_names))}. Update the schema first (hint, use
union_by_name)."
- ) from e
-
- if table_schema.as_struct() != task_schema.as_struct():
- from rich.console import Console
- from rich.table import Table as RichTable
+ task_schema = assign_fresh_schema_ids(
+ _pyarrow_to_schema_without_ids(other_schema,
downcast_ns_timestamp_to_us=downcast_ns_timestamp_to_us)
+ )
- console = Console(record=True)
+ extra_fields = task_schema.field_names - table_schema.field_names
+ missing_fields = table_schema.field_names - task_schema.field_names
+ fields_in_both =
task_schema.field_names.intersection(table_schema.field_names)
+
+ from rich.console import Console
+ from rich.table import Table as RichTable
+
+ console = Console(record=True)
+
+ rich_table = RichTable(show_header=True, header_style="bold")
+ rich_table.add_column("Field Name")
+ rich_table.add_column("Category")
+ rich_table.add_column("Table field")
+ rich_table.add_column("Dataframe field")
+
+ def print_nullability(required: bool) -> str:
+ return "required" if required else "optional"
+
+ for field_name in fields_in_both:
+ lhs = table_schema.find_field(field_name)
+ rhs = task_schema.find_field(field_name)
+ # Check nullability
+ if lhs.required != rhs.required:
+ rich_table.add_row(
+ field_name,
+ "Nullability",
+ f"{print_nullability(lhs.required)} {str(lhs.field_type)}",
+ f"{print_nullability(rhs.required)} {str(rhs.field_type)}",
+ )
+ # Check if type is consistent
+ if any(
+ (isinstance(lhs.field_type, container_type) and
isinstance(rhs.field_type, container_type))
+ for container_type in {StructType, MapType, ListType}
Review Comment:
The `field_names` list contains both parent and child fields as separate
entries.
We ignore checking the type of the parent if they are any of the container
types (StructType, MapType and ListType), because the overall type of the
container will be unequal: `MapType(StringType(), IntegerType()) !=
MapType(StringType(), StringType())`. We leave the work of comparing the types
and nullability of the child fields when we are checking the child nodes.
--
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]