diff --git a/api/src/main/java/org/apache/iceberg/Schema.java b/api/src/main/java/org/apache/iceberg/Schema.java index 3e59998be476..ed4d1d60e901 100644 --- a/api/src/main/java/org/apache/iceberg/Schema.java +++ b/api/src/main/java/org/apache/iceberg/Schema.java @@ -81,6 +81,7 @@ public class Schema implements Serializable { private transient Map> idToAccessor = null; private transient Map idToName = null; private transient Set identifierFieldIdSet = null; + private transient Set identifierFieldNameSet = null; private final transient Map idsToReassigned; private final transient Map idsToOriginal; @@ -254,6 +255,16 @@ private Set lazyIdentifierFieldIdSet() { return identifierFieldIdSet; } + private Set lazyIdentifierFieldNameSet() { + if (identifierFieldNameSet == null) { + this.identifierFieldNameSet = + lazyIdentifierFieldIdSet().stream() + .map(id -> lazyIdToName().get(id)) + .collect(ImmutableSet.toImmutableSet()); + } + return identifierFieldNameSet; + } + /** * Returns the schema ID for this schema. * @@ -331,9 +342,7 @@ public Set identifierFieldIds() { /** Returns the set of identifier field names. */ public Set identifierFieldNames() { - return identifierFieldIds().stream() - .map(id -> lazyIdToName().get(id)) - .collect(Collectors.toSet()); + return lazyIdentifierFieldNameSet(); } /** diff --git a/core/src/main/java/org/apache/iceberg/SchemaUpdate.java b/core/src/main/java/org/apache/iceberg/SchemaUpdate.java index 1fa6ebbe8fef..ed26bdb82446 100644 --- a/core/src/main/java/org/apache/iceberg/SchemaUpdate.java +++ b/core/src/main/java/org/apache/iceberg/SchemaUpdate.java @@ -87,7 +87,7 @@ private SchemaUpdate(TableOperations ops, TableMetadata base, Schema schema, int this.schema = schema; this.lastColumnId = lastColumnId; this.idToParent = Maps.newHashMap(TypeUtil.indexParents(schema.asStruct())); - this.identifierFieldNames = schema.identifierFieldNames(); + this.identifierFieldNames = Sets.newHashSet(schema.identifierFieldNames()); } @Override