@VisibleForTesting
  static boolean tableHasModified(UnkeyedTable baseStore, Table table) {
    String hiveTransientTime = table.getParameters().get("transient_lastDdlTime");
    StructLikeMap<Map<String, String>> structLikeMap = baseStore.partitionProperty();
    String mixedTransientTime = null;
    if (structLikeMap.get(TablePropertyUtil.EMPTY_STRUCT) != null) {
      mixedTransientTime =
          structLikeMap
              .get(TablePropertyUtil.EMPTY_STRUCT)
              .get(HiveTableProperties.PARTITION_PROPERTIES_KEY_TRANSIENT_TIME);
    }
    String hiveLocation = table.getSd().getLocation();
    String mixedPartitionLocation =
        baseStore.partitionProperty().containsKey(TablePropertyUtil.EMPTY_STRUCT)
            ? baseStore
                .partitionProperty()
                .get(TablePropertyUtil.EMPTY_STRUCT)
                .get(HiveTableProperties.PARTITION_PROPERTIES_KEY_HIVE_LOCATION)
            : null;

    // hive partition location is modified only in mixed-hive table full optimizing, So if the hive
    // partition
    // location is different from the mixed-hive table partition location, it is not necessary to
    // trigger
    // synchronization from the hive side to the mixed-hive table
    if (mixedPartitionLocation != null && !mixedPartitionLocation.equals(hiveLocation)) {
      return false;
    }

    // compare hive partition parameter transient_lastDdlTime with mixed-hive table partition
    // properties to
    // find out if the partition is changed.
    return mixedTransientTime == null || !mixedTransientTime.equals(hiveTransientTime);
  }
if iceberg partition location is existed, should update hive table location.
amoro-format-mixed/amoro-mixed-hive/src/main/java/org/apache/amoro/hive/utils/HiveMetaSynchronizer.java