This is an automated email from the ASF dual-hosted git repository.
etudenhoefner pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg.git
The following commit(s) were added to refs/heads/main by this push:
new ce7c2c150c API, Core, Kafka, Spark: Reduce enum array allocation
(#10126)
ce7c2c150c is described below
commit ce7c2c150ce449666cd690612d075fa9893f3118
Author: sullis <[email protected]>
AuthorDate: Fri Apr 12 08:51:09 2024 -0700
API, Core, Kafka, Spark: Reduce enum array allocation (#10126)
---
api/src/main/java/org/apache/iceberg/FileFormat.java | 4 +++-
core/src/main/java/org/apache/iceberg/BaseFile.java | 3 ++-
core/src/main/java/org/apache/iceberg/CachingCatalog.java | 3 ++-
core/src/main/java/org/apache/iceberg/GenericManifestEntry.java | 3 ++-
core/src/main/java/org/apache/iceberg/GenericManifestFile.java | 3 ++-
.../main/java/org/apache/iceberg/hadoop/HadoopTableOperations.java | 4 +++-
.../src/main/java/org/apache/iceberg/connect/events/Event.java | 3 ++-
.../src/main/java/org/apache/iceberg/spark/SparkContentFile.java | 4 +++-
.../src/main/java/org/apache/iceberg/spark/SparkContentFile.java | 4 +++-
9 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/api/src/main/java/org/apache/iceberg/FileFormat.java
b/api/src/main/java/org/apache/iceberg/FileFormat.java
index 892475780b..d662437d5d 100644
--- a/api/src/main/java/org/apache/iceberg/FileFormat.java
+++ b/api/src/main/java/org/apache/iceberg/FileFormat.java
@@ -32,6 +32,8 @@ public enum FileFormat {
private final String ext;
private final boolean splittable;
+ private static final FileFormat[] VALUES = values();
+
FileFormat(String ext, boolean splittable) {
this.ext = "." + ext;
this.splittable = splittable;
@@ -55,7 +57,7 @@ public enum FileFormat {
}
public static FileFormat fromFileName(CharSequence filename) {
- for (FileFormat format : FileFormat.values()) {
+ for (FileFormat format : VALUES) {
int extStart = filename.length() - format.ext.length();
if (Comparators.charSequences()
.compare(format.ext, filename.subSequence(extStart,
filename.length()))
diff --git a/core/src/main/java/org/apache/iceberg/BaseFile.java
b/core/src/main/java/org/apache/iceberg/BaseFile.java
index 6fe2fcc149..d4583b31c7 100644
--- a/core/src/main/java/org/apache/iceberg/BaseFile.java
+++ b/core/src/main/java/org/apache/iceberg/BaseFile.java
@@ -45,6 +45,7 @@ abstract class BaseFile<F>
StructLike,
SpecificData.SchemaConstructable,
Serializable {
+ private static final FileContent[] FILE_CONTENT_VALUES =
FileContent.values();
static final Types.StructType EMPTY_STRUCT_TYPE = Types.StructType.of();
static final PartitionData EMPTY_PARTITION_DATA =
new PartitionData(EMPTY_STRUCT_TYPE) {
@@ -268,7 +269,7 @@ abstract class BaseFile<F>
}
switch (pos) {
case 0:
- this.content = value != null ? FileContent.values()[(Integer) value] :
FileContent.DATA;
+ this.content = value != null ? FILE_CONTENT_VALUES[(Integer) value] :
FileContent.DATA;
return;
case 1:
// always coerce to String for Serializable
diff --git a/core/src/main/java/org/apache/iceberg/CachingCatalog.java
b/core/src/main/java/org/apache/iceberg/CachingCatalog.java
index f6c3657ff1..1043e3e720 100644
--- a/core/src/main/java/org/apache/iceberg/CachingCatalog.java
+++ b/core/src/main/java/org/apache/iceberg/CachingCatalog.java
@@ -45,6 +45,7 @@ import org.slf4j.LoggerFactory;
*/
public class CachingCatalog implements Catalog {
private static final Logger LOG =
LoggerFactory.getLogger(CachingCatalog.class);
+ private static final MetadataTableType[] METADATA_TABLE_TYPE_VALUES =
MetadataTableType.values();
public static Catalog wrap(Catalog catalog) {
return wrap(catalog, CatalogProperties.CACHE_EXPIRATION_INTERVAL_MS_OFF);
@@ -197,7 +198,7 @@ public class CachingCatalog implements Catalog {
private Iterable<TableIdentifier> metadataTableIdentifiers(TableIdentifier
ident) {
ImmutableList.Builder<TableIdentifier> builder = ImmutableList.builder();
- for (MetadataTableType type : MetadataTableType.values()) {
+ for (MetadataTableType type : METADATA_TABLE_TYPE_VALUES) {
// metadata table resolution is case insensitive right now
builder.add(TableIdentifier.parse(ident + "." + type.name()));
builder.add(TableIdentifier.parse(ident + "." +
type.name().toLowerCase(Locale.ROOT)));
diff --git a/core/src/main/java/org/apache/iceberg/GenericManifestEntry.java
b/core/src/main/java/org/apache/iceberg/GenericManifestEntry.java
index 96a475881d..959e2446c7 100644
--- a/core/src/main/java/org/apache/iceberg/GenericManifestEntry.java
+++ b/core/src/main/java/org/apache/iceberg/GenericManifestEntry.java
@@ -26,6 +26,7 @@ import org.apache.iceberg.types.Types;
class GenericManifestEntry<F extends ContentFile<F>>
implements ManifestEntry<F>, IndexedRecord,
SpecificData.SchemaConstructable, StructLike {
+ private static final Status[] STATUS_VALUES = Status.values();
private final org.apache.avro.Schema schema;
private Status status = Status.EXISTING;
private Long snapshotId = null;
@@ -151,7 +152,7 @@ class GenericManifestEntry<F extends ContentFile<F>>
public void put(int i, Object v) {
switch (i) {
case 0:
- this.status = Status.values()[(Integer) v];
+ this.status = STATUS_VALUES[(Integer) v];
return;
case 1:
this.snapshotId = (Long) v;
diff --git a/core/src/main/java/org/apache/iceberg/GenericManifestFile.java
b/core/src/main/java/org/apache/iceberg/GenericManifestFile.java
index d6b7636d3a..ed94da5e17 100644
--- a/core/src/main/java/org/apache/iceberg/GenericManifestFile.java
+++ b/core/src/main/java/org/apache/iceberg/GenericManifestFile.java
@@ -39,6 +39,7 @@ public class GenericManifestFile
implements ManifestFile, StructLike, IndexedRecord, SchemaConstructable,
Serializable {
private static final Schema AVRO_SCHEMA =
AvroSchemaUtil.convert(ManifestFile.schema(), "manifest_file");
+ private static final ManifestContent[] MANIFEST_CONTENT_VALUES =
ManifestContent.values();
private transient Schema avroSchema; // not final for Java serialization
private int[] fromProjectionPos;
@@ -339,7 +340,7 @@ public class GenericManifestFile
return;
case 3:
this.content =
- value != null ? ManifestContent.values()[(Integer) value] :
ManifestContent.DATA;
+ value != null ? MANIFEST_CONTENT_VALUES[(Integer) value] :
ManifestContent.DATA;
return;
case 4:
this.sequenceNumber = value != null ? (Long) value : 0;
diff --git
a/core/src/main/java/org/apache/iceberg/hadoop/HadoopTableOperations.java
b/core/src/main/java/org/apache/iceberg/hadoop/HadoopTableOperations.java
index 9ef2c63e26..4e815ceff5 100644
--- a/core/src/main/java/org/apache/iceberg/hadoop/HadoopTableOperations.java
+++ b/core/src/main/java/org/apache/iceberg/hadoop/HadoopTableOperations.java
@@ -60,6 +60,8 @@ import org.slf4j.LoggerFactory;
public class HadoopTableOperations implements TableOperations {
private static final Logger LOG =
LoggerFactory.getLogger(HadoopTableOperations.class);
private static final Pattern VERSION_PATTERN =
Pattern.compile("v([^\\.]*)\\..*");
+ private static final TableMetadataParser.Codec[]
TABLE_METADATA_PARSER_CODEC_VALUES =
+ TableMetadataParser.Codec.values();
private final Configuration conf;
private final Path location;
@@ -235,7 +237,7 @@ public class HadoopTableOperations implements
TableOperations {
@VisibleForTesting
Path getMetadataFile(int metadataVersion) throws IOException {
- for (TableMetadataParser.Codec codec : TableMetadataParser.Codec.values())
{
+ for (TableMetadataParser.Codec codec : TABLE_METADATA_PARSER_CODEC_VALUES)
{
Path metadataFile = metadataFilePath(metadataVersion, codec);
FileSystem fs = getFileSystem(metadataFile, conf);
if (fs.exists(metadataFile)) {
diff --git
a/kafka-connect/kafka-connect-events/src/main/java/org/apache/iceberg/connect/events/Event.java
b/kafka-connect/kafka-connect-events/src/main/java/org/apache/iceberg/connect/events/Event.java
index 8b6dbc0f45..72d7e22d18 100644
---
a/kafka-connect/kafka-connect-events/src/main/java/org/apache/iceberg/connect/events/Event.java
+++
b/kafka-connect/kafka-connect-events/src/main/java/org/apache/iceberg/connect/events/Event.java
@@ -41,6 +41,7 @@ import org.apache.iceberg.util.DateTimeUtil;
*/
public class Event implements IndexedRecord {
+ private static final PayloadType[] PAYLOAD_TYPE_VALUES =
PayloadType.values();
private UUID id;
private PayloadType type;
private OffsetDateTime timestamp;
@@ -115,7 +116,7 @@ public class Event implements IndexedRecord {
this.id = (UUID) v;
return;
case TYPE:
- this.type = v == null ? null : PayloadType.values()[(Integer) v];
+ this.type = v == null ? null : PAYLOAD_TYPE_VALUES[(Integer) v];
return;
case TIMESTAMP:
this.timestamp = v == null ? null :
DateTimeUtil.timestamptzFromMicros((Long) v);
diff --git
a/spark/v3.4/spark/src/main/java/org/apache/iceberg/spark/SparkContentFile.java
b/spark/v3.4/spark/src/main/java/org/apache/iceberg/spark/SparkContentFile.java
index 3dd8049c13..f756c4cde0 100644
---
a/spark/v3.4/spark/src/main/java/org/apache/iceberg/spark/SparkContentFile.java
+++
b/spark/v3.4/spark/src/main/java/org/apache/iceberg/spark/SparkContentFile.java
@@ -35,6 +35,8 @@ import org.apache.spark.sql.types.StructType;
public abstract class SparkContentFile<F> implements ContentFile<F> {
+ private static final FileContent[] FILE_CONTENT_VALUES =
FileContent.values();
+
private final int fileContentPosition;
private final int filePathPosition;
private final int fileFormatPosition;
@@ -126,7 +128,7 @@ public abstract class SparkContentFile<F> implements
ContentFile<F> {
if (wrapped.isNullAt(fileContentPosition)) {
return null;
}
- return FileContent.values()[wrapped.getInt(fileContentPosition)];
+ return FILE_CONTENT_VALUES[wrapped.getInt(fileContentPosition)];
}
@Override
diff --git
a/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/SparkContentFile.java
b/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/SparkContentFile.java
index 3dd8049c13..f756c4cde0 100644
---
a/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/SparkContentFile.java
+++
b/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/SparkContentFile.java
@@ -35,6 +35,8 @@ import org.apache.spark.sql.types.StructType;
public abstract class SparkContentFile<F> implements ContentFile<F> {
+ private static final FileContent[] FILE_CONTENT_VALUES =
FileContent.values();
+
private final int fileContentPosition;
private final int filePathPosition;
private final int fileFormatPosition;
@@ -126,7 +128,7 @@ public abstract class SparkContentFile<F> implements
ContentFile<F> {
if (wrapped.isNullAt(fileContentPosition)) {
return null;
}
- return FileContent.values()[wrapped.getInt(fileContentPosition)];
+ return FILE_CONTENT_VALUES[wrapped.getInt(fileContentPosition)];
}
@Override