{"record":{"id":"8951633104b66ab2","repo":"apache/iceberg","slug":"fallback-to-use-none-distribution-mode-beca","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/v1.20/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/v1.20/flink/src/main/java/org/apache/iceberg/flink/sink/dynamic/HashKeyGenerator.java#L122-L158","documentation":"In the dynamic Iceberg sink's HashKeyGenerator, a table requesting HASH distribution with no equality fields and an unpartitioned spec has no key to hash on. The generator warns and falls back to a table-level key selector (keying by table name with limited parallelism) instead of a partition key selector.","triggerScenarios":"A DynamicRecord targeting an unpartitioned table with empty equality fields whose requested distribution mode resolves to HASH.","commonSituations":"Sending upsert-style records to an unpartitioned table without declaring equality fields; table metadata lacking identifier fields; copy-pasted job config assuming partitioned tables.","solutions":["Declare equality fields on the dynamic records / target table so hash distribution has keys.","Add partitioning to the table if hash-by-partition was intended.","Accept the fallback — records are keyed per table, which serializes writes to that table (reduced parallelism)."],"exampleFix":"// before\ndynamicRecord.withEqualityFields(Collections.emptyList()) // unpartitioned table, HASH mode\n// after\ndynamicRecord.withEqualityFields(Arrays.asList(\"id\"))","handlingStrategy":"validation","validationCode":"if (distMode == HASH && spec.isUnpartitioned() && equalityFields.isEmpty()) {\n  LOG.warn(\"Table {} will fall back to per-table keying; declare equality fields or partitioning\", tableName);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Ensure DynamicRecords carry equality fields for keyed tables.","Verify table partition specs before enabling HASH distribution."],"tags":["flink","dynamic-sink","distribution-mode"],"backgroundTag":"invalid-config-value","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"}