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
- Cast or exclude the unsupported column from the SELECT list (e.g. SELECT col::text to read as VARCHAR)
- Upgrade to a newer Beam version — the type map gains support over time
- Read the column with a custom statement and convert it in a DoFn instead of automatic schema inference
- 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
- Cast exotic columns (arrays, json, geometry) to text/varchar in the SELECT list
- Check vendor type mappings of your JDBC driver before using readRows with auto schema
- Keep Beam version current for broader type support
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
- BeamRowMapper does not have support for fields of type ${fie
- Length of Schema.Field[${field.getName()}] data exceeds data
- Unable to generate coder for schema {schema}
- Expecting exactly one field, found
- The input schema must have exactly one field of type byte.
AI-assisted analysis of apache/beam@12126d8942 (2026-09-13).
Data as JSON: /api/errors/a40928e9902c36e2.
Report an issue: GitHub.