apache/beam · error · UnsupportedOperationException

Converting ${jdbcType} to Beam schema type is not supported

Error message

Converting ${jdbcType} to Beam schema type is not supported

What it means

SchemaUtil.jdbcTypeToBeamFieldConverter maps JDBC metadata types to Beam Schema.FieldTypes. The default branch throws UnsupportedOperationException for JDBC types the mapper does not handle (unless the Java Object is a UUID, which maps to JDBC_UUID, or falls back to OTHER_AS_STRING).

Source

Thrown at sdks/java/io/jdbc/src/main/java/org/apache/beam/sdk/io/jdbc/SchemaUtil.java:172

        return beamFieldOfType(LogicalTypes.JDBC_TIMESTAMP_WITH_TIMEZONE_TYPE);
      case TINYINT:
        return beamFieldOfType(Schema.FieldType.BYTE);
      case VARBINARY:
        return beamLogicalField(VARBINARY.getName(), VariableBytes::of);
      case VARCHAR:
        return beamLogicalField(VARCHAR.getName(), VariableString::of);
      case BLOB:
        return beamFieldOfType(FieldType.BYTES);
      case CLOB:
        return beamFieldOfType(FieldType.STRING);
      case OTHER:
      case JAVA_OBJECT:
        if (UUID.class.getName().equals(className)) {
          return beamFieldOfType(LogicalTypes.JDBC_UUID_TYPE);
        }
        return beamFieldOfType(LogicalTypes.OTHER_AS_STRING_TYPE);
      default:
        throw new UnsupportedOperationException(
            "Converting " + jdbcType + " to Beam schema type is not supported");
    }
  }

  /** Infers the Beam {@link Schema} from {@link ResultSetMetaData}. */
  public static Schema toBeamSchema(ResultSetMetaData md) throws SQLException {
    Schema.Builder schemaBuilder = Schema.builder();

    for (int i = 1; i <= md.getColumnCount(); i++) {
      JDBCType jdbcType = JDBCType.valueOf(md.getColumnType(i));
      String className = md.getColumnClassName(i);
      BeamFieldConverter fieldConverter = jdbcTypeToBeamFieldConverter(jdbcType, className);
      schemaBuilder.addField(fieldConverter.create(i, md));
    }

    return schemaBuilder.build();
  }

View on GitHub (pinned to 12126d8942)

Solutions

  1. Cast or exclude the unsupported column from the SELECT list (e.g. SELECT col::text to read as VARCHAR)
  2. Upgrade to a newer Beam version — the type map gains support over time
  3. Read the column with a custom statement and convert it in a DoFn instead of automatic schema inference
  4. If the column is a UUID-like object, ensure the driver reports it as a java.util.UUID class name so it maps to JDBC_UUID

Example fix

// before
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, tags FROM t"); // tags is an ARRAY column
// after
ResultSet rs = stmt.executeQuery("SELECT id, ARRAY_TO_STRING(tags, ',') AS tags FROM t");
Defensive patterns

Strategy: try-catch

Validate before calling

ResultSetMetaData md = rs.getMetaData();
for (int i = 1; i <= md.getColumnCount(); i++) {
  int t = md.getColumnType(i);
  if (t == java.sql.Types.ARRAY || t == java.sql.Types.STRUCT || t == java.sql.Types.JAVA_OBJECT
      || t == java.sql.Types.REF || t == java.sql.Types.DATALINK) {
    throw new IllegalArgumentException("Column " + md.getColumnName(i) + " type " + t + " needs cast/exclusion");
  }
}

Try / catch

try {
  Schema s = SchemaUtil.toBeamSchema(metaData);
} catch (UnsupportedOperationException e) {
  if (e.getMessage().contains("to Beam schema type is not supported")) {
    LOG.error("Unsupported JDBC column type: {} — cast it in SQL or exclude the column", e.getMessage());
  }
  throw e;
}

Prevention

When it happens

Trigger: Calling SchemaUtil.toBeamSchema / fieldConverter on a ResultSetMetaData containing an exotic column type (ARRAY, STRUCT, REF, DATALINK, DISTINCT, or a vendor-specific JAVA_OBJECT that is not UUID) during a JDBC read.

Common situations: Reading from tables with vendor-specific column types (e.g. Postgres array/jsonb columns surfacing as ARRAY/JAVA_OBJECT on some drivers); connecting to less common databases with nonstandard type mappings.

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/a40928e9902c36e2. Report an issue: GitHub.