apache/beam · error · ValueError

Fully qualifed name " " not allowed by filter .

Error message

Fully qualifed name "%s" not allowed by filter %s.

What it means

FullyQualifiedNamedTransform only instantiates transforms whose fully qualified names match an allowlist glob (set via the filter option, e.g. by Beam's interactive/YAML sandboxes); the resolved constructor's module path failed fnmatch against that filter, so the load is refused for safety.

Solutions

  1. Widen or adjust the filter glob to include the needed module path
  2. Move/reconstruct the transform under an already-allowed package
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at sdks/python/apache_beam/transforms/fully_qualified_named_transform.py:84 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of apache/beam@12126d8942 (2026-09-13). Data as JSON: /api/errors/51043c9fc44f3276. Report an issue: GitHub.

Appendix: source

Thrown at sdks/python/apache_beam/transforms/fully_qualified_named_transform.py:84

        source = kwargs.pop('source')
      if isinstance(source, str):
        source = python_callable.PythonCallableWithSource(source)

      if self._constructor == '__constructor__':
        transform = source(*args, **kwargs)
      else:
        transform = ptransform._PTransformFnPTransform(source, *args, **kwargs)

    else:
      transform = self._resolve(self._constructor)(*self._args, **self._kwargs)

    return pinput | transform

  @classmethod
  def _check_allowed(cls, fully_qualified_name):
    if not cls._FILTER_GLOB or not fnmatch.fnmatchcase(fully_qualified_name,
                                                       cls._FILTER_GLOB):
      raise ValueError(
          f'Fully qualifed name "{fully_qualified_name}" '
          f'not allowed by filter {cls._FILTER_GLOB}.')

  @classmethod
  def _resolve(cls, fully_qualified_name):
    cls._check_allowed(fully_qualified_name)
    o = None
    path = ''
    for segment in fully_qualified_name.split('.'):
      path = '.'.join([path, segment]) if path else segment
      if o is not None and hasattr(o, segment):
        o = getattr(o, segment)
      else:
        o = importlib.import_module(path)
    return o

  def to_runner_api_parameter(self, unused_context):
    _args_schema = named_fields_to_schema([

View on GitHub (pinned to 12126d8942)