{"record":{"id":"349b757900141c46","repo":"apache/beam","slug":"f-unknown-output-repr-output-at-line-safelineloader-get-line","errorCode":null,"errorMessage":"f'Unknown output {repr(output)} at line {SafeLineLoader.get_line(name)}: {transform} only has outputs {list(outputs.keys())}'","messagePattern":"f'Unknown output (.+?) at line (.+?): (.+?) only has outputs (.+?)'","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/yaml/yaml_transform.py","lineNumber":222,"sourceCode":"              self._all_followers[transform_id].append(transform['__uuid__'])\n    return self._all_followers[self.get_transform_id(transform_name)]\n\n  def compute_all(self):\n    for transform_id in self._transforms_by_uuid.keys():\n      self.compute_outputs(transform_id)\n\n  def get_pcollection(self, name):\n    if name in self._inputs:\n      return self._inputs[name]\n    elif '.' in name:\n      transform, output = name.rsplit('.', 1)\n      outputs = self.get_outputs(transform)\n      if output in outputs:\n        return outputs[output]\n      elif len(outputs) == 1 and outputs[next(iter(outputs))].tag == output:\n        return outputs[next(iter(outputs))]\n      else:\n        raise ValueError(\n            f'Unknown output {repr(output)} '\n            f'at line {SafeLineLoader.get_line(name)}: '\n            f'{transform} only has outputs {list(outputs.keys())}')\n    else:\n      outputs = self.get_outputs(name)\n      if len(outputs) == 1:\n        return only_element(outputs.values())\n      else:\n        error_output = self._transforms_by_uuid[self.get_transform_id(\n            name)]['config'].get('error_handling', {}).get('output')\n        if error_output and error_output in outputs and len(outputs) == 2:\n          return next(\n              output for tag, output in outputs.items() if tag != error_output)\n        raise ValueError(\n            f'Ambiguous output at line {SafeLineLoader.get_line(name)}: '\n            f'{name} has outputs {list(outputs.keys())}')\n\n  def get_outputs(self, transform_name):","sourceCodeStart":204,"sourceCodeEnd":240,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/yaml/yaml_transform.py#L204-L240","documentation":"Scope.get_pcollection resolves a reference of the form `TransformName.output` to a PCollection. When the named output tag does not exist on the transform's outputs (and the transform does not have exactly one output), Beam raises this ValueError listing the outputs the transform actually produces.","triggerScenarios":"Writing an input reference like `MyTransform.bad_rows` where `MyTransform` has no output tagged `bad_rows`; referencing an output of a single-output transform with a tag it does not use; typos in the output tag after the dot.","commonSituations":"Typos in dotted references; upstream transform renamed its output tags; referencing an error-handling output that was never configured; copy-pasting references between pipelines.","solutions":["Correct the output tag after the dot to one of the outputs listed in the error.","Compare the reference against the transform's actual output tags.","If the transform has only one output, drop the `.tag` suffix and reference the transform name alone.","If you expected an error output, add `error_handling: {output: ...}` config to the producing transform."],"exampleFix":"# before\ninput: LogRows.missing_collumn\n# after\ninput: LogRows.missing_column","handlingStrategy":"validation","validationCode":"tags = {'main', 'errors'}  # outputs the transform actually declares\nref, _, tag = input_ref.partition('.')\nif tag and tag not in tags:\n    raise ValueError(f'{ref} has no output {tag}; known: {tags}')","typeGuard":"def output_exists(transform_spec, tag):\n    known = set(transform_spec.get('outputs', {}).keys()) | {'main'}\n    return tag in known","tryCatchPattern":"try:\n    pcoll = scope.get_pcollection(name)\nexcept ValueError as e:\n    if 'Unknown output' in str(e):\n        raise UserPipelineError(f'Fix reference {name}; available outputs are listed in the message') from e","preventionTips":["Reference single-output transforms without a .tag suffix","Keep output tag names in sync when refactoring transforms","Check error_handling.output config when consuming error outputs"],"tags":["yaml","beam-yaml","pipeline-definition","output-reference"],"backgroundTag":"resource-not-found","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}