{"record":{"id":"04f596d0743b9c73","repo":"apache/beam","slug":"beamrowmapper-does-not-have-support-for-fields-of-type","errorCode":null,"errorMessage":"BeamRowMapper does not have support for fields of type ${fieldType}","messagePattern":"BeamRowMapper does not have support for fields of type (.+?)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"sdks/java/io/jdbc/src/main/java/org/apache/beam/sdk/io/jdbc/SchemaUtil.java","lineNumber":262,"sourceCode":"    };\n  }\n\n  /** Creates a {@link ResultSetFieldExtractor} for the given type. */\n  private static ResultSetFieldExtractor createFieldExtractor(Schema.FieldType fieldType) {\n    Schema.TypeName typeName = fieldType.getTypeName();\n    switch (typeName) {\n      case ARRAY:\n      case ITERABLE:\n        Schema.FieldType elementType = checkArgumentNotNull(fieldType.getCollectionElementType());\n        ResultSetFieldExtractor elementExtractor = createFieldExtractor(elementType);\n        return createArrayExtractor(elementExtractor);\n      case DATETIME:\n        return TIMESTAMP_EXTRACTOR;\n      case LOGICAL_TYPE:\n        return createLogicalTypeExtractor(checkArgumentNotNull(fieldType.getLogicalType()));\n      default:\n        if (!RESULTSET_FIELD_EXTRACTORS.containsKey(typeName)) {\n          throw new UnsupportedOperationException(\n              \"BeamRowMapper does not have support for fields of type \" + fieldType);\n        }\n        return RESULTSET_FIELD_EXTRACTORS.get(typeName);\n    }\n  }\n\n  /** Creates a {@link ResultSetFieldExtractor} for array types. */\n  private static ResultSetFieldExtractor createArrayExtractor(\n      ResultSetFieldExtractor elementExtractor) {\n    return (rs, index) -> {\n      Array arrayVal = rs.getArray(index);\n      if (arrayVal == null) {\n        return null;\n      }\n\n      List<@Nullable Object> arrayElements = new ArrayList<>();\n      ResultSet arrayRs = checkArgumentNotNull(arrayVal.getResultSet());\n      while (arrayRs.next()) {","sourceCodeStart":244,"sourceCodeEnd":280,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/io/jdbc/src/main/java/org/apache/beam/sdk/io/jdbc/SchemaUtil.java#L244-L280","documentation":"SchemaUtil.createFieldExtractor builds per-field ResultSet extractors for mapping rows into Beam Rows. The default branch throws UnsupportedOperationException when the Beam field type has no registered extractor in RESULTSET_FIELD_EXTRACTORS, i.e. BeamRowMapper cannot read that field type back from the ResultSet.","triggerScenarios":"Using JdbcIO.readRows() / BeamRowMapper on a query whose ResultSet metadata maps to a Beam FieldType without a registered extractor (e.g. certain logical types or binary/array types on drivers Beam does not map).","commonSituations":"Schema inference picked a logical type (e.g. from JDBC_UUID handling or OTHER_AS_STRING) that the extractor map lacks; driver returns unusual metadata types; reading columns with vendor-specific types.","solutions":["Coerce the column in SQL to a supported base type (e.g. CAST(col AS VARCHAR), col::text)","Upgrade Beam — extractor coverage expands across releases","Use JdbcIO.read() with a custom RowMapper instead of readRows for unsupported columns","Check the field type in the inferred schema and override it by writing a custom query with explicit typing"],"exampleFix":"// before\n\"SELECT id, geometry FROM places\" // geometry has no extractor\n// after\n\"SELECT id, ST_AsText(geometry) AS geometry FROM places\" // read as STRING","handlingStrategy":"try-catch","validationCode":"for (Schema.Field f : schema.getFields()) {\n  Schema.FieldType ft = f.getType();\n  if (ft.getTypeName() != Schema.TypeName.STRING && ft.getTypeName() != Schema.TypeName.INT64\n      && ft.getTypeName() != Schema.TypeName.FLOAT64 && ft.getTypeName() != Schema.TypeName.BYTES\n      && ft.getTypeName() != Schema.TypeName.DATETIME && ft.getTypeName() != Schema.TypeName.LOGICAL_TYPE) {\n    LOG.warn(\"Field {} of type {} may lack a ResultSet extractor\", f.getName(), ft);\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  PCollection<Row> rows = pipeline.apply(JdbcIO.readRows()...);\n} catch (UnsupportedOperationException e) {\n  if (e.getMessage().contains(\"BeamRowMapper does not have support for fields of type\")) {\n    LOG.error(\"Cast the offending column in SQL or use a custom RowMapper\");\n  }\n  throw e;\n}","preventionTips":["Restrict SELECT lists to columns with well-supported types","Cast unsupported columns with SQL (CAST/::text) before readRows","Use JdbcIO.read() with a custom RowMapper for exotic columns","Upgrade Beam when hitting gaps in extractor coverage"],"tags":["jdbc","beam","schema","type-conversion"],"backgroundTag":"unsupported-operation","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}