apache/beam · error · UnsupportedOperationException

Row OutputReceiver unsupported in

Error message

Row OutputReceiver unsupported in %s

What it means

outputRowReceiver() throws UnsupportedOperationException because this invoker implementation has no Row output receiver bound. It exists for DoFns producing schema Row outputs; when unsupported, the invoker cannot deliver Row-typed outputs. The message's error context says which invoker it was.

Solutions

  1. Bind a row output receiver factory when constructing the invoker
  2. Use the standard runner path where schema output receivers are wired automatically
  3. If the DoFn does not emit Rows, avoid calling outputRowReceiver; use outputReceiver instead
  4. Verify schema/Row output configuration on the PTransform

Example fix

// before
OutputReceiver<Row> rr = invoker.outputRowReceiver(doFn); // throws
// after
OutputReceiver<Row> rr = rowReceiverFactory != null
    ? invoker.outputRowReceiver(doFn)
    : adaptToRowReceiver(invoker.outputReceiver(doFn));
Defensive patterns

Strategy: fallback

Validate before calling

boolean schemaOutput = doFn instanceof DoFnWithRowOutput;

Type guard

null

Try / catch

try { rr = invoker.outputRowReceiver(doFn); } catch (UnsupportedOperationException e) { rr = adapt(invoker.outputReceiver(doFn)); }

Prevention

When it happens

Trigger: Calling outputRowReceiver(DoFn) on a base DelegatingDoFnInvoker or an invoker constructed without a row output receiver factory; schema-aware DoFn code emitting Row outputs through an invoker without row support.

Common situations: Pipeline steps that convert DoFn output to Beam Rows (schema pipelines) run through a custom or stub invoker; test harness that only wires generic output receivers.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


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

Appendix: source

Thrown at sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/reflect/DoFnInvoker.java:402

      throw new UnsupportedOperationException(
          String.format("TimeDomain unsupported in %s", getErrorContext()));
    }

    @Override
    public OutputReceiver<OutputT> outputReceiver(DoFn<InputT, OutputT> doFn) {
      throw new UnsupportedOperationException(
          String.format("OutputReceiver unsupported in %s", getErrorContext()));
    }

    @Override
    public OutputReceiver<Row> outputRowReceiver(DoFn<InputT, OutputT> doFn) {
      throw new UnsupportedOperationException(
          String.format("Row OutputReceiver unsupported in %s", getErrorContext()));
    }

    @Override
    public MultiOutputReceiver taggedOutputReceiver(DoFn<InputT, OutputT> doFn) {
      throw new UnsupportedOperationException(
          String.format("MultiOutputReceiver unsupported in %s", getErrorContext()));
    }

    @Override
    public Object restriction() {
      throw new UnsupportedOperationException(
          String.format("Restriction unsupported in %s", getErrorContext()));
    }

    @Override
    public BoundedWindow window() {
      throw new UnsupportedOperationException(
          String.format("BoundedWindow unsupported in %s", getErrorContext()));
    }

    @Override
    public PaneInfo paneInfo(DoFn<InputT, OutputT> doFn) {
      throw new UnsupportedOperationException(

View on GitHub (pinned to 12126d8942)