apache/beam · error

Schema missing on RowType

Error message

Schema missing on RowType

What it means

RowCoder encountered a rowType schema field whose schema property is undefined. A row-typed field is encoded by recursively constructing a nested RowCoder from its schema, so the throw fires when the rowType input lacks the schema payload it requires (malformed or incompletely populated schema proto).

Solutions

  1. Set rowType.schema on every row-typed field before passing the schema to RowCoder (or use RowCoder.fromSchema with a fully specified Schema proto).
  2. If the schema came from JSON inference, verify the nested row values were plain objects so inferSchemaOfJSON could derive a nested schema.
  3. Log typeInfo.rowType at the throw site to identify which field is missing its schema.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at sdks/typescript/src/apache_beam/coders/row_coder.ts:286 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/45fff144328cd8f0. Report an issue: GitHub.

Appendix: source

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

              `Encountered an Atomic type that is not currently supported by RowCoder: ${atomicType}`,
            );
        }
        break;
      case "arrayType":
        if (typeInfo.arrayType.elementType !== undefined) {
          return new IterableCoder(
            this.getCoderFromType(typeInfo.arrayType.elementType),
          );
        } else {
          throw new Error("ElementType missing on ArrayType");
        }
      // case "iterableType":
      // case "mapType":
      case "rowType":
        if (typeInfo.rowType.schema !== undefined) {
          return RowCoder.fromSchema(typeInfo.rowType.schema);
        } else {
          throw new Error("Schema missing on RowType");
        }
        break;
      case "logicalType":
        const logicalTypeInfo = logicalTypes.get(typeInfo.logicalType.urn);
        if (logicalTypeInfo !== undefined) {
          const reprCoder = this.getCoderFromType(
            typeInfo.logicalType.representation!,
          );
          return {
            encode: (element: any, writer: Writer, context: Context) =>
              reprCoder.encode(
                logicalTypeInfo.toRepr(element),
                writer,
                context,
              ),
            decode: (reader: Reader, context: Context) =>
              logicalTypeInfo.fromRepr(reprCoder.decode(reader, context)),
            toProto: (pipelineContext: ProtoContext) => {

View on GitHub (pinned to 12126d8942)