{"record":{"id":"4ce7dffe4c5ec26e","repo":"apache/beam","slug":"unsupported-logical-type","errorCode":null,"errorMessage":"Unsupported logical type: ","messagePattern":"Unsupported logical type: ","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/CellValueParser.java","lineNumber":70,"sourceCode":"        return Ints.fromByteArray(cellValue.toByteArray());\n      case INT64:\n        checkArgument(valueSize == 8, message(\"Int64\", 8));\n        return Longs.fromByteArray(cellValue.toByteArray());\n      case FLOAT:\n        checkArgument(valueSize == 4, message(\"Float\", 4));\n        return Float.intBitsToFloat(Ints.fromByteArray(cellValue.toByteArray()));\n      case DOUBLE:\n        checkArgument(valueSize == 8, message(\"Double\", 8));\n        return Double.longBitsToDouble(Longs.fromByteArray(cellValue.toByteArray()));\n      case DATETIME:\n        return DateTime.parse(cellValue.toStringUtf8());\n      case STRING:\n        return cellValue.toStringUtf8();\n      case BYTES:\n        return cellValue.toByteArray();\n      case LOGICAL_TYPE:\n        String identifier = checkArgumentNotNull(type.getLogicalType()).getIdentifier();\n        throw new IllegalStateException(\"Unsupported logical type: \" + identifier);\n      default:\n        throw new IllegalArgumentException(\n            String.format(\"Unsupported cell value type '%s'.\", type.getTypeName()));\n    }\n  }\n\n  ByteString valueToByteString(Object value, Schema.FieldType type) {\n    switch (type.getTypeName()) {\n      case BOOLEAN:\n        return byteString(((Boolean) value) ? new byte[] {1} : new byte[] {0});\n      case FLOAT:\n        return byteString(Ints.toByteArray(Float.floatToIntBits((Float) value)));\n      case DOUBLE:\n        return byteString(Longs.toByteArray(Double.doubleToLongBits((Double) value)));\n      case BYTE:\n        return byteString(new byte[] {(Byte) value});\n      case INT16:\n        return byteString(Shorts.toByteArray((Short) value));","sourceCodeStart":52,"sourceCodeEnd":88,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/CellValueParser.java#L52-L88","documentation":"CellValueParser.getCellValue converts a Bigtable cell ByteString back into a Java object based on the declared Beam Schema FieldType. LOGICAL_TYPE fields are not supported for parsing: the parser immediately throws an IllegalStateException naming the logical type's identifier. The library can only decode primitive (STRING/BYTES/numeric/BOOLEAN...) cell values.","triggerScenarios":"Reading Bigtable rows into a Beam schema whose field type is a logical type (e.g. beam:logical_type:javasdk:...) instead of a primitive type, causing the switch in getCellValue to hit case LOGICAL_TYPE and throw.","commonSituations":"Defining a BigtableIO read with a custom Schema that uses a LogicalType (like a custom enum or datetime logical type) for a column family cell; users assume round-tripping works because writing may pass through via PassThroughLogicalType.","solutions":["Change the schema field type to a primitive type (STRING or BYTES) and convert the logical value in user code after reading.","If the logical type is a PassThroughLogicalType, read using its getBaseType() instead of the logical type.","Implement a custom mapper/parse function on BigtableIO.read() instead of relying on schema auto-mapping."],"exampleFix":"// before\nSchema.FieldType fieldType = Schema.FieldType.logicalType(MyLogicalType.of());\n// after\nSchema.FieldType fieldType = Schema.FieldType.STRING;\nRow row = ...; // parse MyLogicalType.from(row.getString(\"col\")) in user code","handlingStrategy":"validation","validationCode":"for (Schema.Field f : schema.getFields()) {\n  if (f.getType().getTypeName() == Schema.TypeName.LOGICAL_TYPE) {\n    throw new IllegalArgumentException(\n      \"Field \" + f.getName() + \" uses logical type \" + f.getType().getLogicalType().getIdentifier()\n      + \" which BigtableIO cannot parse; use a primitive type.\");\n  }\n}","typeGuard":"static boolean isParsableCellType(Schema.FieldType t) {\n  return t.getTypeName() != Schema.TypeName.LOGICAL_TYPE;\n}","tryCatchPattern":null,"preventionTips":["Keep Bigtable read schemas limited to primitive field types.","Convert logical values (dates, enums) to strings/bytes in user code after reading.","Unit-test schema round-trips against BigtableIO before deploying."],"tags":["bigtable","schema","logical-type","java"],"backgroundTag":"unsupported-operation","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}