apache/iceberg · warning

Skipping bloom filter config for missing field

Error message

Skipping bloom filter config for missing field: {}

What it means

When building a Parquet writer, a bloom filter enablement was requested for a column path that does not exist in the actual Parquet schema being written. The config for that column is skipped with a warning instead of failing, and the writer proceeds without bloom filters for the missing field.

Solutions

  1. Remove or correct the bloom filter config for the non-existent column path
  2. Update the config after schema evolution so it references current columns
  3. Verify column path casing/segmentation matches the Iceberg schema (nested paths use dot notation)

Example fix

// before (table property)
'write.parquet.bloom-filter.enabled.column':'id'  // column 'id' dropped from schema
// after
ALTER TABLE t UNSET TBLPROPERTIES ('write.parquet.bloom-filter.enabled.column');
Defensive patterns

Strategy: validation

Validate before calling

write.parquet.bloom-filter.enabled.column.<col> settings should reference columns verified against currentSchema().columns() before configuring the writer

Prevention

When it happens

Trigger: Setting table/config property write.parquet.bloom-filter.enabled.column:<col>=true for a column absent from the written schema (e.g. after schema evolution, dropped column, or case-sensitivity mismatch).

Common situations: Bloom filter configs set on a table whose write schema was narrowed; partition-column or identity-mapped columns not present in the data file schema; typo in the column path.

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

Appendix: source

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

    WriteBuilder createContextFunc(Function<Map<String, String>, Context> newCreateContextFunc) {
      this.createContextFunc = newCreateContextFunc;
      return this;
    }

    private void setBloomFilterConfig(
        Context context,
        Map<String, String> colNameToParquetPathMap,
        BiConsumer<String, Boolean> withBloomFilterEnabled,
        BiConsumer<String, Double> withBloomFilterFPP,
        BiConsumer<String, Long> withBloomFilterNDV) {

      context
          .columnBloomFilterEnabled()
          .forEach(
              (colPath, isEnabled) -> {
                String parquetColumnPath = colNameToParquetPathMap.get(colPath);
                if (parquetColumnPath == null) {
                  LOG.warn("Skipping bloom filter config for missing field: {}", colPath);
                  return;
                }

                withBloomFilterEnabled.accept(parquetColumnPath, Boolean.valueOf(isEnabled));
                String fpp = context.columnBloomFilterFpp().get(colPath);
                if (fpp != null) {
                  withBloomFilterFPP.accept(parquetColumnPath, Double.parseDouble(fpp));
                }
                String ndv = context.columnBloomFilterNdv().get(colPath);
                if (ndv != null) {
                  withBloomFilterNDV.accept(parquetColumnPath, Long.parseLong(ndv));
                }
              });
    }

    private void setColumnStatsConfig(
        Context context,
        Map<String, String> colNameToParquetPathMap,

View on GitHub (pinned to 86d9c8fc54)