{"record":{"id":"5cb95ac0d1bcb17c","repo":"apache/druid","slug":"duplicate-spatial-dimension-names-found-check-you","errorCode":null,"errorMessage":"Duplicate spatial dimension names found! Check your schema yo!","messagePattern":"Duplicate spatial dimension names found! Check your schema yo!","errorType":"validation","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/segment/incremental/SpatialDimensionRowTransformer.java","lineNumber":61,"sourceCode":"import java.util.Set;\n\n/**\n * We throw away all invalid spatial dimensions\n */\npublic class SpatialDimensionRowTransformer implements Function<InputRow, InputRow>\n{\n  private static final Joiner JOINER = Joiner.on(\",\");\n  private static final Splitter SPLITTER = Splitter.on(\",\");\n\n  private final Map<String, SpatialDimensionSchema> spatialDimensionMap;\n  private final Set<String> spatialPartialDimNames;\n\n  public SpatialDimensionRowTransformer(List<SpatialDimensionSchema> spatialDimensions)\n  {\n    this.spatialDimensionMap = new HashMap<>();\n    for (SpatialDimensionSchema spatialDimension : spatialDimensions) {\n      if (this.spatialDimensionMap.put(spatialDimension.getDimName(), spatialDimension) != null) {\n        throw new ISE(\"Duplicate spatial dimension names found! Check your schema yo!\");\n      }\n    }\n    this.spatialPartialDimNames = Sets.newHashSet(\n        Iterables.concat(\n            Lists.transform(\n                spatialDimensions,\n                new Function<SpatialDimensionSchema, List<String>>()\n                {\n                  @Override\n                  public List<String> apply(SpatialDimensionSchema input)\n                  {\n                    return input.getDims();\n                  }\n                }\n            )\n        )\n    );\n  }","sourceCodeStart":43,"sourceCodeEnd":79,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/segment/incremental/SpatialDimensionRowTransformer.java#L43-L79","documentation":"SpatialDimensionRowTransformer's constructor detects duplicate names in the configured spatialDimensions list and refuses to build, since each spatial dimension name must map to a unique schema entry. The playful message is legacy Druid wording for a duplicate-name validation error.","triggerScenarios":"Building a SpatialDimensionRowTransformer with two SpatialDimensionSchema entries sharing the same dimName, e.g. a spec listing the same spatial dimension twice.","commonSituations":"Copy-paste errors in ingestion specs; programmatic generation of spatial dimensions that appends duplicates; merging two schemas without deduplication.","solutions":["Deduplicate spatialDimensions in the ingestion spec so each dimName appears once","If programmatically building the list, use a Map keyed by dimName before constructing transformers","Fail spec validation early (check for duplicate spatial dim names before task submission)"],"exampleFix":"// before\nspatialDimensions: [\n  {\"dimName\":\"geo\", \"dims\":[\"lat\",\"lon\"]},\n  {\"dimName\":\"geo\", \"dims\":[\"lat\",\"lon\"]}\n]\n// after\nspatialDimensions: [ {\"dimName\":\"geo\", \"dims\":[\"lat\",\"lon\"]} ]","handlingStrategy":"validation","validationCode":"Set<String> names = new HashSet<>();\nfor (SpatialDimensionSchema s : spatialDimensions) assert names.add(s.getDimName());","typeGuard":null,"tryCatchPattern":"try { new SpatialDimensionRowTransformer(dims); } catch (ISE e) { if (e.getMessage().contains(\"Duplicate spatial\")) { /* dedupe spec */ } throw e; }","preventionTips":["Deduplicate spec lists programmatically","Validate ingestion specs in CI"],"tags":["spatial","schema-validation","configuration"],"backgroundTag":"schema-validation-failed","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}