apache/beam · error

Encountered a type that is not currently supported by RowCod

Error message

Encountered a type that is not currently supported by RowCoder: ${JSON.stringify(f.type)}

What it means

NamedTransform._check_allowed validates a fully qualified transform name against _FILTER_GLOB using fnmatch. If the name does not match the configured allow-list glob (or no glob is set), ValueError is raised. This is a deliberate security/policy gate restricting which transforms a pipeline may resolve by name.

Source

Thrown at sdks/typescript/src/apache_beam/coders/row_coder.ts:130

  private hasNullableFields: boolean;
  private components: Coder<any>[];

  addFieldOfType(obj: any, f: Field, value: any): any {
    if (f.type !== undefined) {
      let typeInfo = f.type?.typeInfo;
      switch (typeInfo.oneofKind) {
        case "atomicType":
        case "rowType":
        case "logicalType":
          obj[f.name] = value;
          break;
        case "arrayType":
          obj[f.name] = value === undefined ? undefined : Array.from(value);
          break;
        // case "iterableType":
        // case "mapType":
        default:
          throw new Error(
            `Encountered a type that is not currently supported by RowCoder: ${JSON.stringify(
              f.type,
            )}`,
          );
      }
      return obj;
    }
  }

  static inferTypeFromJSON(obj: any, nullable: boolean = true): FieldType {
    if (obj instanceof TypePlaceholder) {
      return obj.fieldType;
    }

    let fieldType: FieldType = {
      nullable: nullable,
      typeInfo: {
        oneofKind: undefined,

View on GitHub (pinned to 12126d8942)

Solutions

  1. Adjust _FILTER_GLOB (or the filter configuration) so the fully qualified name matches, e.g. widen the glob pattern.
  2. Use a fully qualified name within the allowed namespace.
  3. Check glob case-sensitivity — fnmatchcase is used, so pattern and name case must match.

Example fix

// before
_FILTER_GLOB = 'apache_beam.transforms.*'
p | NamedTransform('org.apache.beam.sdk.io.kafka.KafkaIO.read')
// after
_FILTER_GLOB = 'org.apache.beam.*'  # or use a name matching the existing filter
Defensive patterns

Strategy: validation

Validate before calling

import fnmatch
assert fnmatch.fnmatchcase(fully_qualified_name, NamedTransform._FILTER_GLOB), f'{fully_qualified_name} not allowed by {NamedTransform._FILTER_GLOB}'

Type guard

def name_allowed(name: str, glob: str) -> bool:
    import fnmatch
    return bool(glob) and fnmatch.fnmatchcase(name, glob)

Try / catch

try:
    p | NamedTransform(fq_name)
except ValueError as e:
    logger.error('Transform blocked by filter: %s', e)
    raise

Prevention

When it happens

Trigger: Resolving/expanding a NamedTransform whose fully qualified name fails fnmatch against cls._FILTER_GLOB, e.g. filter 'apache_beam.transforms.*' with name 'com.example.Custom', called via expand() or _resolve().

Common situations: Class-level _FILTER_GLOB left at a restrictive default or set to the wrong pattern; referencing transforms from third-party packages not covered by the glob; glob typos (case sensitivity: fnmatchcase).

Understand the failure class

Background: Permission denied / not authorized / 403 Forbidden: access-control rejections when the caller lacks the required role, grant, or ownership — this error's family across 18 libraries.

Related errors


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