{"record":{"id":"03ffb9232fe5cee7","repo":"apache/iceberg","slug":"fallback-id-assignment-in-parquet-is-unsafe-and-wi","errorCode":null,"errorMessage":"Fallback ID assignment in Parquet is UNSAFE and will be removed in 2.0.0. Use name mapping instead.","messagePattern":"Fallback ID assignment in Parquet is UNSAFE and will be removed in 2\\.0\\.0\\. Use name mapping instead\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"core/src/main/java/org/apache/iceberg/SystemConfigs.java","lineNumber":93,"sourceCode":"   */\n  public static final ConfigEntry<Integer> IO_MANIFEST_CACHE_MAX_FILEIO =\n      new ConfigEntry<>(\n          \"iceberg.io.manifest.cache.fileio-max\",\n          \"ICEBERG_IO_MANIFEST_CACHE_FILEIO_MAX\",\n          8,\n          Integer::parseUnsignedInt);\n\n  /**\n   * @deprecated will be removed in 2.0.0; use name mapping instead\n   */\n  @Deprecated\n  public static final ConfigEntry<Boolean> NETFLIX_UNSAFE_PARQUET_ID_FALLBACK_ENABLED =\n      new ConfigEntry<>(\n          \"iceberg.netflix.unsafe-parquet-id-fallback.enabled\",\n          \"ICEBERG_NETFLIX_UNSAFE_PARQUET_ID_FALLBACK_ENABLED\",\n          true,\n          s -> {\n            LOG.warn(\n                \"Fallback ID assignment in Parquet is UNSAFE and will be removed in 2.0.0. Use name mapping instead.\");\n            return Boolean.parseBoolean(s);\n          });\n\n  public static class ConfigEntry<T> {\n    private final String propertyKey;\n    private final String envKey;\n    private final T defaultValue;\n    private final Function<String, T> parseFunc;\n    private T lazyValue = null;\n\n    private ConfigEntry(\n        String propertyKey, String envKey, T defaultValue, Function<String, T> parseFunc) {\n      this.propertyKey = propertyKey;\n      this.envKey = envKey;\n      this.defaultValue = defaultValue;\n      this.parseFunc = parseFunc;\n    }","sourceCodeStart":75,"sourceCodeEnd":111,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/core/src/main/java/org/apache/iceberg/SystemConfigs.java#L75-L111","documentation":"The Netlify/Netflix-specific fallback config iceberg.netflix.unsafe-parquet-id-fallback.enabled assigns Parquet column IDs by field name/position when no name mapping exists, which is unsafe. Logging this warning signals the fallback is active and that the mechanism will be removed in Iceberg 2.0.0; users should migrate to name mapping. The default is true, so legacy pipelines see this warning on read paths using this config entry.","triggerScenarios":"Reading/writing Parquet files where field IDs cannot be resolved from a name mapping and the config iceberg.netflix.unsafe-parquet-id-fallback.enabled is consulted (default true); the parse function logs the warning each time the config value is parsed.","commonSituations":"Legacy tables written before name mappings were introduced; reading Parquet files produced by external writers that omit field IDs; migrations from older Netflix/internal pipelines; planning ahead for the 2.0.0 removal.","solutions":["Ensure a name mapping exists for the table (set schema.name-mapping.default) so ID resolution does not need the fallback.","Rewrite affected Parquet files so they embed proper field IDs.","Set iceberg.netflix.unsafe-parquet-id-fallback.enabled=false to confirm nothing depends on the fallback, then keep it off.","Plan migration before upgrading to 2.0.0 where this fallback is removed."],"exampleFix":"// before\n// table has no name mapping; fallback silently used\nTable table = catalog.loadTable(identifier);\n// after\nTable table = catalog.loadTable(identifier);\ntable.updateProperties().set(\"schema.name-mapping.default\", NameMappingParser.toJson(\n    MappingsGenerator.generate(table.schema()))).commit(); // explicit mapping instead of unsafe fallback","handlingStrategy":"validation","validationCode":"String mapping = table.properties().get(\"schema.name-mapping.default\");\nif (mapping == null) {\n  throw new IllegalStateException(\"Set schema.name-mapping.default before relying on Parquet ID fallback\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always define schema.name-mapping.default on tables read from ID-less Parquet","Rewrite legacy Parquet files to embed field IDs","Set the fallback config to false in test environments to catch reliance early","Track the Iceberg 2.0.0 release notes for removal of this fallback"],"tags":["parquet","deprecation","name-mapping","configuration"],"backgroundTag":"deprecated-api-usage","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}