{"record":{"id":"177a1e2e1cee8c4e","repo":"apache/beam","slug":"transform-class-name-is-not-registered-with-a-supported-type","errorCode":null,"errorMessage":"Transform {class_name} is not registered with a supported type. Please register the transform with a supported type using register_input_dtype decorator.","messagePattern":"Transform (.+?) is not registered with a supported type\\. Please register the transform with a supported type using register_input_dtype decorator\\.","errorType":"exception","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/ml/transforms/handlers.py","lineNumber":210,"sourceCode":"      # sometimes a numpy type can be provided as np.dtype('int64').\n      # convert numpy.dtype to numpy type since both are same.\n      for name, typ in inferred_types.items():\n        if isinstance(typ, np.dtype):\n          inferred_types[name] = typ.type\n\n      return inferred_types\n    except:  # pylint: disable=bare-except\n      return {}\n\n  def _map_column_names_to_types_from_transforms(self):\n    column_type_mapping = {}\n    for transform in self.transforms:\n      for col in transform.columns:\n        if col not in column_type_mapping:\n          # we just need to dtype of first occurance of column in transforms.\n          class_name = transform.__class__.__name__\n          if class_name not in _EXPECTED_TYPES:\n            raise KeyError(\n                f\"Transform {class_name} is not registered with a supported \"\n                \"type. Please register the transform with a supported type \"\n                \"using register_input_dtype decorator.\")\n          column_type_mapping[col] = _EXPECTED_TYPES[\n              transform.__class__.__name__]\n    return column_type_mapping\n\n  def get_raw_data_feature_spec(\n      self, input_types: dict[str, type]) -> dict[str, tf.io.VarLenFeature]:\n    \"\"\"\n    Return a DatasetMetadata object to be used with\n    tft_beam.AnalyzeAndTransformDataset.\n    Args:\n      input_types: A dictionary of column names and types.\n    Returns:\n      A DatasetMetadata object.\n    \"\"\"\n    raw_data_feature_spec = {}","sourceCodeStart":192,"sourceCodeEnd":228,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/ml/transforms/handlers.py#L192-L228","documentation":"MLTransform maps columns to input dtypes via the _EXPECTED_TYPES registry, populated by the @register_input_dtype decorator. If a transform's class was never registered with a supported input dtype, the column-type mapping cannot proceed and KeyError is raised.","triggerScenarios":"Using a custom (or third-party) transformation class inside MLTransform without decorating it with @register_input_dtype(input_type=...); class renamed so the registry lookup by class name misses.","commonSituations":"Writing a custom RunInference-style or custom embedding handler and plugging it into MLTransform; upgrading Beam where a transform's class name changed.","solutions":["Decorate your transform class with @register_input_dtype(dtype) so it lands in _EXPECTED_TYPES.","Use a built-in supported transform instead of the custom class.","If a class was renamed, register the new class name or revert the rename."],"exampleFix":"// before\nclass MyEmbeddings(EmbeddingsHandler):\n    ...\n// after\n@register_input_dtype(str)\nclass MyEmbeddings(EmbeddingsHandler):\n    ...","handlingStrategy":"try-catch","validationCode":"from apache_beam.ml.transforms.handlers import _EXPECTED_TYPES\nassert type(my_transform).__name__ in _EXPECTED_TYPES","typeGuard":null,"tryCatchPattern":"try:\n    result = (pcoll | MLTransform(...))\nexcept KeyError as e:\n    if 'not registered with a supported' in str(e):\n        register_input_dtype(str)(MyTransform)\n        result = (pcoll | MLTransform(...))","preventionTips":["Apply @register_input_dtype to every custom transform","Check _EXPECTED_TYPES before composing new transforms"],"tags":["python","mltransform","registry"],"backgroundTag":"class-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"}