apache/beam · error · UnsupportedOperationException

Cannot translate Euphoria 'Join' operator to Beam…

Error message

Cannot translate Euphoria 'Join' operator to Beam transformations. Given join type '${joinType}' is not supported.

What it means

JoinTranslator.getJoinFn maps Euphoria Join.Type to a concrete JoinFn (LeftOuterJoinFn, RightOuterJoinFn, FullJoinFn). Any join type outside LEFT/RIGHT/FULL falls into the default branch and throws UnsupportedOperationException, because no JoinFn exists for it in this translation path.

Solutions

  1. Express the inner join via Join.Type.LEFT followed by filtering out null right values
  2. Use CoGroup/Join.translate alternatives or a two-sided flat-mapping combine that supports inner semantics
  3. Upgrade/patch Beam's euphoria extension to add an InnerJoinFn implementation
  4. Verify the Join.Type used; only LEFT, RIGHT and FULL are accepted

Example fix

// before
Join.of(left, right).by(l -> l, r -> r).type(Join.Type.INNER).apply(...)
// after
Join.of(left, right).by(l -> l, r -> r).type(Join.Type.LEFT).apply(...) // then filter nulls
Defensive patterns

Strategy: validation

Validate before calling

if (operator.getType() != Join.Type.LEFT && operator.getType() != Join.Type.RIGHT && operator.getType() != Join.Type.FULL) { throw new IllegalArgumentException("JoinTranslator supports only LEFT/RIGHT/FULL"); }

Type guard

boolean isSupportedJoinType(Join.Type t) { return EnumSet.of(Join.Type.LEFT, Join.Type.RIGHT, Join.Type.FULL).contains(t); }

Try / catch

try { fn = getJoinFn(operator, ...); } catch (UnsupportedOperationException e) { /* emulate INNER via LEFT join + null filter */ }

Prevention

When it happens

Trigger: Translating a Euphoria Join operator with Join.Type.INNER through JoinTranslator.getJoinFn (the CoGroup-based translation path).

Common situations: Migrating inner joins from other Euphoria backends (Spark/Flink) to Beam where inner join is normally the default; users assuming INNER is supported.

Related errors


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

Appendix: source

Thrown at sdks/java/extensions/euphoria/src/main/java/org/apache/beam/sdk/extensions/euphoria/core/translate/JoinTranslator.java:244

      TupleTag<LeftT> leftTag,
      TupleTag<RightT> rightTag,
      AccumulatorProvider accumulators) {
    final BinaryFunctor<LeftT, RightT, OutputT> joiner = operator.getJoiner();
    switch (operator.getType()) {
      case INNER:
        return new InnerJoinFn<>(
            joiner, leftTag, rightTag, operator.getName().orElse(null), accumulators);
      case LEFT:
        return new LeftOuterJoinFn<>(
            joiner, leftTag, rightTag, operator.getName().orElse(null), accumulators);
      case RIGHT:
        return new RightOuterJoinFn<>(
            joiner, leftTag, rightTag, operator.getName().orElse(null), accumulators);
      case FULL:
        return new FullJoinFn<>(
            joiner, leftTag, rightTag, operator.getName().orElse(null), accumulators);
      default:
        throw new UnsupportedOperationException(
            String.format(
                "Cannot translate Euphoria '%s' operator to Beam transformations."
                    + " Given join type '%s' is not supported.",
                Join.class.getSimpleName(), operator.getType()));
    }
  }

  @Override
  PCollection<KV<KeyT, OutputT>> translate(
      Join<LeftT, RightT, KeyT, OutputT> operator,
      PCollection<LeftT> left,
      PCollection<KV<KeyT, LeftT>> leftKeyed,
      PCollection<RightT> right,
      PCollection<KV<KeyT, RightT>> rightKeyed) {
    final AccumulatorProvider accumulators =
        new LazyAccumulatorProvider(AccumulatorProvider.of(leftKeyed.getPipeline()));
    final TupleTag<LeftT> leftTag = new TupleTag<>();
    final TupleTag<RightT> rightTag = new TupleTag<>();

View on GitHub (pinned to 12126d8942)