{"record":{"id":"8ce001b707e73157","repo":"apache/beam","slug":"converting-bigquery-type-to-beam-type-is-unsupported","errorCode":null,"errorMessage":"Converting BigQuery type  to Beam type is unsupported","messagePattern":"Converting BigQuery type  to Beam type is unsupported","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryUtils.java","lineNumber":489,"sourceCode":"      case \"TIMESTAMP\":\n        // Timestamp columns can only have 6 (micros) or 12 (picos) precision.\n        // BigQuerySchema currently returns null for all microsecond timestamp\n        // columns but this cannot be guaranteed forever.\n        if ((schema.getTimestampPrecision() == null)\n            || Long.valueOf(6L).equals(schema.getTimestampPrecision())) {\n          return FieldType.DATETIME;\n        }\n        switch (options.getPicosecondTimestampMapping()) {\n          case MILLIS:\n            return FieldType.logicalType(Timestamp.MILLIS);\n          case MICROS:\n            return FieldType.logicalType(Timestamp.MICROS);\n          case NANOS:\n            return FieldType.logicalType(Timestamp.NANOS);\n          case PICOS:\n            return FieldType.STRING;\n          default:\n            throw new UnsupportedOperationException(\n                \"Converting BigQuery type \" + typeName + \" to Beam type is unsupported\");\n        }\n      case \"DATE\":\n        return FieldType.logicalType(SqlTypes.DATE);\n      case \"TIME\":\n        return FieldType.logicalType(SqlTypes.TIME);\n      case \"DATETIME\":\n        return FieldType.logicalType(SqlTypes.DATETIME);\n      case \"NUMERIC\":\n      case \"BIGNUMERIC\":\n        return FieldType.DECIMAL;\n      case \"GEOGRAPHY\":\n      case \"JSON\":\n        // TODO Add metadata for custom sql types ?\n        return FieldType.STRING;\n      case \"RECORD\":\n      case \"STRUCT\":\n        List<TableFieldSchema> nestedFields = schema.getFields();","sourceCodeStart":471,"sourceCodeEnd":507,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryUtils.java#L471-L507","documentation":"BigQueryUtils.fromTableFieldSchemaType throws this UnsupportedOperationException while mapping a BigQuery TIMESTAMP column to a Beam FieldType when the column has picosecond (12-digit) timestamp precision and the configured PicosecondTimestampMapping option has no recognized case (MILLIS, MICROS, NANOS, PICOS). It signals that the user-supplied conversion option value is not one of the supported enum constants. Note the message renders an empty type name because the switch operates on the literal \"TIMESTAMP\" string and typeName is interpolated in a context where it appears blank in some builds.","triggerScenarios":"Reading a BigQuery table whose TIMESTAMP field carries timestampPrecision=12 (picoseconds) via BeamIO.bigqueryTableSchemaToSchema / fromTableSchema with a SchemaConversionOptions whose getPicosecondTimestampMapping() returns an unexpected value (e.g. null-deserialized or a future enum constant from a newer SDK being read by an older switch).","commonSituations":"Users on older Beam versions reading tables written by newer BigQuery clients that set picosecond precision; constructing SchemaConversionOptions programmatically with a wrong/legacy enum; deserialized pipeline options losing the mapping enum.","solutions":["Upgrade Apache Beam to a version that supports picosecond timestamps and the full PicosecondTimestampMapping enum.","Explicitly set SchemaConversionOptions.withPicosecondTimestampMapping(PicosecondTimestampMapping.MICROS) (or NANOS/PICOS/MILLIS) when calling fromTableSchema.","If upgrading is impossible, avoid picosecond-precision TIMESTAMP columns (use precision 6 / standard TIMESTAMP) or map them to STRING before conversion."],"exampleFix":"// before\nSchema beamSchema = BigQueryUtils.fromTableSchema(tableSchema);\n// after\nSchema beamSchema = BigQueryUtils.fromTableSchema(\n    tableSchema,\n    SchemaConversionOptions.builder()\n        .setPicosecondTimestampMapping(PicosecondTimestampMapping.MICROS)\n        .build());","handlingStrategy":"validation","validationCode":"TableFieldSchema tsField = /* find TIMESTAMP field */;\nboolean pico = tsField.getTimestampPrecision() != null && tsField.getTimestampPrecision() == 12L;\nif (pico) {\n  // ensure a supported mapping is configured\n  PicosecondTimestampMapping m = options.getPicosecondTimestampMapping();\n  if (m != PicosecondTimestampMapping.MILLIS && m != PicosecondTimestampMapping.MICROS\n      && m != PicosecondTimestampMapping.NANOS && m != PicosecondTimestampMapping.PICOS) {\n    throw new IllegalStateException(\"Set a valid PicosecondTimestampMapping before converting\");\n  }\n}","typeGuard":"boolean hasSupportedPicoMapping(SchemaConversionOptions o) {\n  Enum<?> m = o.getPicosecondTimestampMapping();\n  return m != null && java.util.Arrays.stream(PicosecondTimestampMapping.values()).anyMatch(v -> v == m);\n}","tryCatchPattern":"try {\n  Schema s = BigQueryUtils.fromTableSchema(tableSchema, options);\n} catch (UnsupportedOperationException e) {\n  // fall back to a known-good mapping\n  Schema s = BigQueryUtils.fromTableSchema(\n      tableSchema,\n      SchemaConversionOptions.builder()\n          .setPicosecondTimestampMapping(PicosecondTimestampMapping.MICROS).build());\n}","preventionTips":["Always pass an explicit SchemaConversionOptions with a valid PicosecondTimestampMapping when reading BigQuery schemas.","Upgrade Beam before reading tables produced by newer BigQuery clients with picosecond timestamps.","Pin and document the SDK version compatibility for picosecond-precision TIMESTAMP columns."],"tags":["bigquery","beam","schema-conversion","unsupported-enum","timestamp"],"backgroundTag":"unsupported-enum-value","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}