StructField.physical_name always uses the column mapping physical name if it is present in the metadata. However, we must be aware of the column mapping mode when setting the physical name. For instance, a StructField containing physical name metadata must still use the logical name if the column mapping mode is None.
A successful implementation would: Make physical name take ColumnMappingMode parameter, and produce the correct name based on the mode
Context here.