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

  1. Remove or fix the stats-enabled config for the missing column path
  2. Re-sync per-column properties with the current schema after evolution
  3. 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

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


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)