{"record":{"id":"df08720004af05d2","repo":"apache/beam","slug":"invalid-column-col-in-fields-column-name-must-be-a-str","errorCode":null,"errorMessage":"Invalid column \"{col}\" in \"fields\". Column name must be a str.","messagePattern":"Invalid column \"(.+?)\" in \"fields\"\\. Column name must be a str\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/yaml/yaml_join.py","lineNumber":122,"sourceCode":"        f'{error_prefix} '\n        f'The provided equalities do not connect all of {list(pcolls.keys())}.')\n\n  return equalities\n\n\ndef _parse_fields(tables, fields):\n  error_prefix = f'Invalid value \"{fields}\" for \"fields\".'\n  if not isinstance(fields, dict):\n    raise ValueError(f'{error_prefix} Fields must be a dict.')\n  output_fields = []\n  named_columns = set()\n  for input, cols in fields.items():\n    if input not in tables:\n      raise ValueError(f'An invalid input \"{input}\" was specified in \"fields\".')\n    if isinstance(cols, list):\n      for col in cols:\n        if not isinstance(col, str):\n          raise ValueError(\n              f'Invalid column \"{col}\" in \"fields\". Column name must be a str.')\n        if col in named_columns:\n          raise ValueError(\n              f'The field name \"{col}\" was specified more than once.')\n        output_fields.append(f'{input}.{col} AS {col}')\n        named_columns.add(col)\n    elif isinstance(cols, dict):\n      for k, v in cols.items():\n        if k in named_columns:\n          raise ValueError(\n              f'The field name \"{k}\" was specified more than once.')\n        if not isinstance(v, str):\n          raise ValueError(\n              f'Invalid column \"{v}\" in \"fields\". Column name must be a str.')\n        output_fields.append(f'{input}.{v} AS {k}')\n        named_columns.add(k)\n    else:\n      raise ValueError(","sourceCodeStart":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/yaml/yaml_join.py#L104-L140","documentation":"When the value for an input in 'fields' is a list, each entry is used directly as an output column name and must be a string. A non-string entry (number, bool, nested structure) triggers this ValueError.","triggerScenarios":"Writing fields: {left: [id, 42]} or {left: [id, [name]]} — any list element that is not a str.","commonSituations":"YAML auto-typing numeric column names into ints; accidentally nesting a list; pasting schema objects instead of plain column names.","solutions":["Quote each column name so YAML keeps it a string, e.g. '123'.","Remove or flatten any nested structures in the column list.","Rename numeric columns upstream so they are valid string names."],"exampleFix":"// before\nfields:\n  left: [id, 42]\n// after\nfields:\n  left: [id, \"42\"]","handlingStrategy":"type-guard","validationCode":"def check_list_cols(fields):\n    for alias, cols in fields.items():\n        if isinstance(cols, list):\n            assert all(isinstance(c, str) for c in cols), f'non-str column for {alias}'","typeGuard":"def all_str(items):\n    return isinstance(items, list) and all(isinstance(c, str) for c in items)","tryCatchPattern":"try:\n    result = SqlJoinTransform(config)\nexcept ValueError as e:\n    if 'Column name must be a str' in str(e):\n        raise ConfigError('quote numeric column names in fields lists') from e\n    raise","preventionTips":["Quote column names that look numeric or boolean in YAML","Inspect the parsed spec (yaml.safe_load) to confirm types","Avoid pasting schema objects where plain strings are expected"],"tags":["apache-beam","yaml","type-error","fields"],"backgroundTag":"type-mismatch","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"}