{"record":{"id":"66f40cf2ac53481b","repo":"apache/iceberg","slug":"fallback-to-use-none-distribution-mode-beca-66f40c","errorCode":null,"errorMessage":"{}: Fallback to use 'none' distribution mode, because there are no equality fields set and table is unpartitioned","messagePattern":"(.+?): Fallback to use 'none' distribution mode, because there are no equality fields set and table is unpartitioned","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"flink/v2.3/flink/src/main/java/org/apache/iceberg/flink/sink/dynamic/HashKeyGenerator.java","lineNumber":140,"sourceCode":"      int writeParallelism) {\n    LOG.debug(\n        \"Creating new KeySelector for table '{}' with distribution mode '{}'\", tableName, mode);\n    switch (mode) {\n      case NONE:\n        if (equalityFields.isEmpty()) {\n          return tableKeySelector(tableName, writeParallelism, maxWriteParallelism);\n        } else {\n          LOG.info(\n              \"{}: Distribute rows by equality fields, because there are equality fields set\",\n              tableName);\n          return equalityFieldKeySelector(\n              tableName, schema, equalityFields, writeParallelism, maxWriteParallelism);\n        }\n\n      case HASH:\n        if (equalityFields.isEmpty()) {\n          if (spec.isUnpartitioned()) {\n            LOG.warn(\n                \"{}: Fallback to use 'none' distribution mode, because there are no equality fields set \"\n                    + \"and table is unpartitioned\",\n                tableName);\n            return tableKeySelector(tableName, writeParallelism, maxWriteParallelism);\n          } else {\n            return partitionKeySelector(\n                tableName, schema, spec, writeParallelism, maxWriteParallelism);\n          }\n        } else {\n          if (spec.isUnpartitioned()) {\n            LOG.info(\n                \"{}: Distribute rows by equality fields, because there are equality fields set \"\n                    + \"and table is unpartitioned\",\n                tableName);\n            return equalityFieldKeySelector(\n                tableName, schema, equalityFields, writeParallelism, maxWriteParallelism);\n          } else {\n            for (PartitionField partitionField : spec.fields()) {","sourceCodeStart":122,"sourceCodeEnd":158,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/flink/v2.3/flink/src/main/java/org/apache/iceberg/flink/sink/dynamic/HashKeyGenerator.java#L122-L158","documentation":"In HashKeyGenerator (dynamic sink), when the requested write uses HASH distribution but has no equality fields and the table is unpartitioned, there is no meaningful key to distribute by, so it warns and falls back to a table-level key selector ('none' mode), bucketing only by table name up to the write parallelism.","triggerScenarios":"A DynamicRecord targeting an unpartitioned table with no equality fields arrives while the distribution mode resolves to HASH in HashKeyGenerator.getKeySelector.","commonSituations":"Dynamic Iceberg sink jobs writing append-only data to unpartitioned tables; per-table metadata (distribution-mode=hash) set without partition keys; uneven/small-file output across writers.","solutions":["Partition the target tables so a partitionKeySelector can be used","Accept the table-level fallback if append throughput is fine and files are adequately sized","Set the tables' write.distribution-mode to 'none' explicitly to make the fallback intentional and silence intent ambiguity"],"exampleFix":"// before\n// table unpartitioned, no equality fields, distribution-mode=hash\n// after\nALTER TABLE t SET TBLPROPERTIES ('write.distribution-mode'='none');","handlingStrategy":"validation","validationCode":"if (spec.isUnpartitioned() && equalityFields.isEmpty() && \"hash\".equals(distributionMode)) {\n  // expect 'none' fallback; adjust table or mode\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep dynamic-sink target tables partitioned or mode=none","Monitor file counts/sizes per table","Centralize table property management"],"tags":["flink","iceberg","dynamic-sink","distribution-mode"],"backgroundTag":"missing-required-config-field","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"}