{"record":{"id":"934da59695c6f363","repo":"apache/beam","slug":"unsupported-type-consider-using-withcustomrecordparsing","errorCode":null,"errorMessage":"Unsupported type: , consider using withCustomRecordParsing","messagePattern":"Unsupported type: , consider using withCustomRecordParsing","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"sdks/java/io/csv/src/main/java/org/apache/beam/sdk/io/csv/CsvIOParseHelpers.java","lineNumber":153,"sourceCode":"          return Short.parseShort(cell);\n        case INT32:\n          return Integer.parseInt(cell);\n        case INT64:\n          return Long.parseLong(cell);\n        case BOOLEAN:\n          return Boolean.parseBoolean(cell);\n        case BYTE:\n          return Byte.parseByte(cell);\n        case DECIMAL:\n          return new BigDecimal(cell);\n        case DOUBLE:\n          return Double.parseDouble(cell);\n        case FLOAT:\n          return Float.parseFloat(cell);\n        case DATETIME:\n          return Instant.parse(cell);\n        default:\n          throw new UnsupportedOperationException(\n              \"Unsupported type: \" + fieldType + \", consider using withCustomRecordParsing\");\n      }\n\n    } catch (IllegalArgumentException e) {\n      throw new IllegalArgumentException(\n          e.getMessage() + \" field \" + field.getName() + \" was received -- type mismatch\");\n    }\n  }\n}\n","sourceCodeStart":135,"sourceCodeEnd":163,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/io/csv/src/main/java/org/apache/beam/sdk/io/csv/CsvIOParseHelpers.java#L135-L163","documentation":"CsvIOParseHelpers.parseCell() handles only scalar, string-representable field types (BOOLEAN, INTEGER, LONG, DOUBLE, FLOAT, DATETIME, etc.) and throws UnsupportedOperationException for any other FieldType (e.g. BYTES, arrays, maps, nested rows) telling you to use withCustomRecordParsing. CSV cells are plain strings, so Beam refuses to guess a serialization for complex types.","triggerScenarios":"Applying CsvIO.read to a schema containing an unsupported FieldType such as BYTES, ITERABLE, MAP, or a logical/row type without registering a custom parser.","commonSituations":"Reusing an Avro/BigQuery-style schema with binary or nested fields directly as a CSV schema; adding a new complex column to a previously all-scalar CSV pipeline.","solutions":["Register a custom parser for the field via CsvIO's withCustomRecordParsing (custom CellDeserializer for that type).","Change the schema field to a supported scalar type (e.g. encode bytes as Base64 String).","Flatten nested/complex data into scalar columns before CSV round-tripping."],"exampleFix":"// before: schema field FieldType.BYTES -> UnsupportedOperationException\n// after\nCsvIO.read(path)\n    .withCustomRecordParsing(ParsingBuilder.of(schema)\n        .setCustomParser(\"blob\", cell -> Base64.getDecoder().decode(cell))\n        .build());","handlingStrategy":"validation","validationCode":"schema.getFields().forEach(f -> {\n  switch (f.getType().getTypeName()) {\n    case BYTE: case INT16: case INT32: case INT64: case FLOAT: case DOUBLE:\n    case STRING: case BOOLEAN: case DATETIME: break;\n    default: throw new IllegalStateException(\"field \" + f.getName() + \" needs withCustomRecordParsing\");\n  }\n});","typeGuard":null,"tryCatchPattern":"try { pipeline.apply(CsvIO.read(path)); } catch (UnsupportedOperationException e) { /* register custom parser for the offending type */ }","preventionTips":["Design CSV schemas with scalar, string-representable types only.","Register CellDeserializers via withCustomRecordParsing for any non-scalar field.","Encode binary data as Base64 strings before CSV round-trips."],"tags":["java","beam-io","csv","unsupported-type"],"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"}