From 6ac0944c947253697771fe12d4274a14eb34346b Mon Sep 17 00:00:00 2001 From: Bujjibabukatta Date: Thu, 27 Aug 2026 13:32:39 +0530 Subject: [PATCH 1/2] Core, ORC: surface struct-level null counts for content stats --- .../java/org/apache/iceberg/StatsUtil.java | 19 ++++++++++++++++++- .../org/apache/iceberg/orc/OrcMetrics.java | 1 + 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/iceberg/StatsUtil.java b/core/src/main/java/org/apache/iceberg/StatsUtil.java index bef7cc41c189..46f4930b68c1 100644 --- a/core/src/main/java/org/apache/iceberg/StatsUtil.java +++ b/core/src/main/java/org/apache/iceberg/StatsUtil.java @@ -261,10 +261,27 @@ private static Types.NestedField upperBoundField(Type type, int baseId) { @VisibleForTesting static Types.StructType fieldStatsStruct(Type type, int baseId, MetricsModes.MetricsMode mode) { - if (null == mode || mode == MetricsModes.None.get() || type.isNestedType() || baseId < 0) { + if (null == mode || mode == MetricsModes.None.get() || baseId < 0) { return null; } + if (type.isStructType()) { + return Types.StructType.of( + optional( + baseId + VALUE_COUNT_OFFSET, + "value_count", + Types.LongType.get(), + "Number of values (including null)"), + optional( + baseId + NULL_VALUE_COUNT_OFFSET, + "null_value_count", + Types.LongType.get(), + "Number of null values")); + } else if (type.isNestedType()) { + return null; + } + + List fields = Lists.newArrayList(); if (mode.hasBounds()) { diff --git a/orc/src/main/java/org/apache/iceberg/orc/OrcMetrics.java b/orc/src/main/java/org/apache/iceberg/orc/OrcMetrics.java index 7498d6e1558f..62278d446964 100644 --- a/orc/src/main/java/org/apache/iceberg/orc/OrcMetrics.java +++ b/orc/src/main/java/org/apache/iceberg/orc/OrcMetrics.java @@ -388,6 +388,7 @@ public Set record( .filter(Optional::isPresent) .map(Optional::get) .forEach(result::add); + ORCSchemaUtil.icebergID(record).ifPresent(result::add); return result.build(); } } From 451b150041f2f33f2b051e54a4d8a4cddc680d68 Mon Sep 17 00:00:00 2001 From: Bujjibabukatta Date: Sun, 30 Aug 2026 09:59:36 +0530 Subject: [PATCH 2/2] fix: remove extra blank line to satisfy spotless formatting --- core/src/main/java/org/apache/iceberg/StatsUtil.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/org/apache/iceberg/StatsUtil.java b/core/src/main/java/org/apache/iceberg/StatsUtil.java index 46f4930b68c1..a541f21ccecd 100644 --- a/core/src/main/java/org/apache/iceberg/StatsUtil.java +++ b/core/src/main/java/org/apache/iceberg/StatsUtil.java @@ -281,7 +281,6 @@ static Types.StructType fieldStatsStruct(Type type, int baseId, MetricsModes.Met return null; } - List fields = Lists.newArrayList(); if (mode.hasBounds()) {