apache/iceberg · warning
Skipping column statistics config for missing field
Error message
Skipping column statistics config for missing field: {} What it means
When building a Parquet writer, column-statistics collection was requested for a column path not present in the actual Parquet schema. The setting is skipped with a warning and the writer continues without stats for that column.
Solutions
- Remove or fix the stats-enabled config for the missing column path
- Re-sync per-column properties with the current schema after evolution
- Check path spelling and nested-path dot notation
Example fix
// before
'write.parquet.stats-enabled.column':'old_col'='true' // old_col no longer exists
// after
ALTER TABLE t UNSET TBLPROPERTIES ('write.parquet.stats-enabled.column'); Defensive patterns
Strategy: validation
Validate before calling
table.properties().stringPropertyNames().stream().filter(k -> k.startsWith("write.parquet.stats-enabled.column")).forEach(k -> { String col = k.substring(k.lastIndexOf('.')+1); if (table.schema().findField(col) == null) { /* unset stale property */ } }); Prevention
- Reconcile per-column stats properties with schema on every evolution
- Treat per-column Parquet tuning properties as schema-coupled config
- Unset properties for dropped columns
When it happens
Trigger: Setting write.parquet.stats-enabled.column:<col>=true (or equivalent config) for a column that doesn't exist in the file's write schema — e.g. dropped column, schema evolution, or case mismatch.
Common situations: Per-column stats configs retained after columns were dropped/renamed; writing a narrower projection than the table schema where configs referenced projected-out columns.
Understand the failure class
Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.
Related errors
- Class was not found
- Fallback ID assignment in Parquet is UNSAFE and will be…
- Skipping bloom filter config for missing field
- Skipping dictionary encoding config for missing field
- Unsupported compression codec
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/c7aa48bdb65c2ade.
Report an issue: GitHub.
Appendix: source
Thrown at parquet/src/main/java/org/apache/iceberg/parquet/Parquet.java:367
String ndv = context.columnBloomFilterNdv().get(colPath);
if (ndv != null) {
withBloomFilterNDV.accept(parquetColumnPath, Long.parseLong(ndv));
}
});
}
private void setColumnStatsConfig(
Context context,
Map<String, String> colNameToParquetPathMap,
BiConsumer<String, Boolean> withColumnStatsEnabled) {
context
.columnStatsEnabled()
.forEach(
(colPath, isEnabled) -> {
String parquetColumnPath = colNameToParquetPathMap.get(colPath);
if (parquetColumnPath == null) {
LOG.warn("Skipping column statistics config for missing field: {}", colPath);
return;
}
withColumnStatsEnabled.accept(parquetColumnPath, Boolean.valueOf(isEnabled));
});
}
private void setDictionaryEncodingConfig(
Context context,
Map<String, String> colNameToParquetPathMap,
BiConsumer<String, Boolean> withDictionaryEncoding) {
context
.columnDictionaryEncodingEnabled()
.forEach(
(colPath, isEnabled) -> {
String parquetColumnPath = colNameToParquetPathMap.get(colPath);
if (parquetColumnPath == null) {
LOG.warn("Skipping dictionary encoding config for missing field: {}", colPath);View on GitHub (pinned to 86d9c8fc54)