apache/iceberg · warning

Skipping dictionary encoding config for missing field

Error message

Skipping dictionary encoding config for missing field: {}

What it means

When building a Parquet writer, dictionary-encoding was configured for a column path that does not exist in the actual Parquet schema. The config is skipped with a warning; the writer proceeds with dictionary defaults for the missing column.

Solutions

  1. Remove or correct the dictionary-enabled property for the missing column
  2. Update per-column properties after schema changes
  3. Confirm the exact Iceberg column path (nested fields use dot-separated paths)

Example fix

// before
'write.parquet.dictionary-enabled.column':'status'='false'  // 'status' not in schema
// after
ALTER TABLE t UNSET TBLPROPERTIES ('write.parquet.dictionary-enabled.column');
Defensive patterns

Strategy: validation

Validate before calling

table.properties().stringPropertyNames().stream().filter(k -> k.startsWith("write.parquet.dictionary-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.dictionary-enabled.column:<col>=false (or true) for a column absent from the write schema — dropped/renamed column, projection mismatch, or typo.

Common situations: Dictionary configs left over from schema evolution; per-column tuning on identity columns that are not materialized in data files; case-sensitivity differences.

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/853d9f368bb8c0f7. Report an issue: GitHub.

Appendix: source

Thrown at parquet/src/main/java/org/apache/iceberg/parquet/Parquet.java:385

                  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);
                  return;
                }
                withDictionaryEncoding.accept(parquetColumnPath, Boolean.valueOf(isEnabled));
              });
    }

    @Override
    public <D> FileAppender<D> build() throws IOException {
      Preconditions.checkNotNull(schema, "Schema is required");
      Preconditions.checkNotNull(name, "Table name is required and cannot be null");

      // add the Iceberg schema to keyValueMetadata
      meta("iceberg.schema", SchemaParser.toJson(schema));

      // Map Iceberg properties to pass down to the Parquet writer
      Context context = createContextFunc.apply(config);

      int rowGroupSize = context.rowGroupSize();

View on GitHub (pinned to 86d9c8fc54)