{"record":{"id":"77f18a6ef1c6a5fc","repo":"apache/iceberg","slug":"failed-to-parse-spark-view-dependencies","errorCode":null,"errorMessage":"Failed to parse Spark view dependencies","messagePattern":"Failed to parse Spark view dependencies","errorType":"exception","errorClass":"UncheckedIOException","httpStatus":null,"severity":"error","filePath":"spark/v4.2/spark/src/main/java/org/apache/iceberg/spark/source/SparkViewDependenciesParser.java","lineNumber":83,"sourceCode":"      ArrayNode namePartsNode = dependencyNode.putArray(NAME_PARTS);\n      for (String namePart : nameParts) {\n        namePartsNode.add(namePart);\n      }\n    }\n\n    try {\n      return MAPPER.writeValueAsString(dependenciesNode);\n    } catch (IOException e) {\n      throw new UncheckedIOException(\"Failed to write Spark view dependencies\", e);\n    }\n  }\n\n  static DependencyList fromJson(String json) {\n    JsonNode node;\n    try {\n      node = MAPPER.readTree(json);\n    } catch (IOException e) {\n      throw new UncheckedIOException(\"Failed to parse Spark view dependencies\", e);\n    }\n\n    Preconditions.checkArgument(\n        node.isArray(), \"Cannot parse Spark view dependencies from non-array: %s\", node);\n    ImmutableList.Builder<Dependency> dependenciesBuilder = ImmutableList.builder();\n    for (JsonNode dependency : node) {\n      String type = string(TYPE, dependency);\n      String[] nameParts = stringArray(NAME_PARTS, dependency);\n      switch (type) {\n        case TABLE:\n          dependenciesBuilder.add(Dependency.table(nameParts));\n          break;\n        case FUNCTION:\n          dependenciesBuilder.add(Dependency.function(nameParts));\n          break;\n        default:\n          throw new IllegalArgumentException(\"Unsupported Spark view dependency type: \" + type);\n      }","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v4.2/spark/src/main/java/org/apache/iceberg/spark/source/SparkViewDependenciesParser.java#L65-L101","documentation":"SparkViewDependenciesParser.fromJson() parses the view dependencies JSON string. If Jackson cannot read the tree, the IOException is rethrown as UncheckedIOException('Failed to parse Spark view dependencies'). It means the stored metadata JSON is malformed, not merely semantically invalid.","triggerScenarios":"Loading a Spark view whose persisted dependency JSON is truncated, corrupted, or hand-edited; MAPPER.readTree(json) throwing on invalid JSON syntax.","commonSituations":"Manually edited metadata files; interrupted writes leaving partial JSON; version upgrades where an older writer produced incompatible content.","solutions":["Inspect and repair the view metadata JSON so it is a valid JSON array","Recreate the view if its metadata is unrecoverable","Restore from backup or re-register the view with correct metadata location","Validate the JSON with an external parser to pinpoint the syntax error"],"exampleFix":"// before\n// metadata: \"[{\"type\":\"table\",\"name-parts\":[\"db\",\"tbl\"]\"  (truncated)\n// after\n// metadata: \"[{\"type\":\"table\",\"name-parts\":[\"db\",\"tbl\"]}]\"  (valid array)","handlingStrategy":"try-catch","validationCode":"// pre-validate\nif (json == null || json.isBlank()) throw new IllegalArgumentException(\"View dependencies JSON is empty\");","typeGuard":null,"tryCatchPattern":"try { deps = SparkViewDependenciesParser.fromJson(json); } catch (UncheckedIOException e) { log.error(\"Corrupt view dependencies JSON: {}\", json, e); throw new IllegalStateException(\"View metadata unreadable\", e); }","preventionTips":["Never hand-edit view metadata JSON; recreate views instead","Ensure metadata writes complete atomically","Validate stored JSON externally after suspicious writes"],"tags":["spark","iceberg","views","json","parsing"],"backgroundTag":"json-parse-error","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}