apache/beam · error · RuntimeException

Not implemented yet

Error message

Not implemented yet ${fieldDescriptor.getMessageType().getFullName()}

What it means

During conversion of TableRow numeric fields to Storage API protos, integer-typed fields whose value is a protobuf message must be one of the recognized INT/UINT 64 wrapper descriptor names. Any other message type is unsupported and triggers this RuntimeException reporting the full message name.

Solutions

  1. Use google.protobuf.Int64Value/UInt64Value (or another supported wrapper) for integer fields instead of a custom message
  2. Unwrap the value yourself before building the TableRow (set a plain Long)
  3. Check the reported full name against the supported *_VALUE_DESCRIPTOR_NAMES lists in TableRowToStorageApiProto
  4. Upgrade Beam to a version that supports this wrapper type
  5. Contribute support by adding the descriptor name to the mapping lists

Example fix

// before
row.set("count", MyCounterProto.getDefaultInstance());
// after
row.set("count", Int64Value.of(42L));
Defensive patterns

Strategy: validation

Validate before calling

if (fieldValue instanceof Message) {
  String fullName = ((Message) fieldValue).getDescriptorForType().getFullName();
  if (!INT64_VALUE_DESCRIPTOR_NAMES.contains(((Message) fieldValue).getDescriptorForType().getName())
      && !UINT64_VALUE_DESCRIPTOR_NAMES.contains(((Message) fieldValue).getDescriptorForType().getName())) {
    throw new IllegalArgumentException("Unsupported int wrapper: " + fullName);
  }
}

Type guard

boolean isSupportedIntWrapper(Object v) {
  return !(v instanceof Message)
      || INT64_VALUE_DESCRIPTOR_NAMES.contains(((Message) v).getDescriptorForType().getName())
      || UINT64_VALUE_DESCRIPTOR_NAMES.contains(((Message) v).getDescriptorForType().getName());
}

Try / catch

try {
  proto = TableRowToStorageApiProto.messageToValue(schema, row, options);
} catch (RuntimeException e) {
  if (e.getMessage().startsWith("Not implemented yet")) { /* route row to DLQ */ } else throw e;
}

Prevention

When it happens

Trigger: A TableRow field with INTEGER/INT64 schema carries a protobuf message whose full name is not in INT64_VALUE_DESCRIPTOR_NAMES or UINT64_VALUE_DESCRIPTOR_NAMES when messageToValue runs.

Common situations: Pipelines that build TableRows from proto records and keep wrapper messages for int columns, custom Int wrappers, or protobuf versions with new well-known types not yet mapped by Beam.

Related errors


AI-assisted analysis of apache/beam@12126d8942 (2026-09-13). Data as JSON: /api/errors/88587475a2c300b6. Report an issue: GitHub.

Appendix: source

Thrown at sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/TableRowToStorageApiProto.java:1961

                  .getField(message.getDescriptorForType().findFieldByName("value"))
                  .toString();
            } else if (INT64_VALUE_DESCRIPTOR_NAMES.contains(
                fieldDescriptor.getMessageType().getName())) {
              return message
                  .getField(message.getDescriptorForType().findFieldByName("value"))
                  .toString();
            } else if (UINT32_VALUE_DESCRIPTOR_NAMES.contains(
                fieldDescriptor.getMessageType().getName())) {
              return message
                  .getField(message.getDescriptorForType().findFieldByName("value"))
                  .toString();
            } else if (UINT64_VALUE_DESCRIPTOR_NAMES.contains(
                fieldDescriptor.getMessageType().getName())) {
              return message
                  .getField(message.getDescriptorForType().findFieldByName("value"))
                  .toString();
            } else {
              throw new RuntimeException(
                  "Not implemented yet " + fieldDescriptor.getMessageType().getFullName());
            }
          default:
            return fieldValue.toString();
        }
      case BYTES:
        switch (fieldDescriptor.getType()) {
          case BYTES:
            return BaseEncoding.base64().encode(((ByteString) fieldValue).toByteArray());
          case STRING:
            return BaseEncoding.base64()
                .encode(((String) fieldValue).getBytes(StandardCharsets.UTF_8));
          case MESSAGE:
            Message message = (Message) fieldValue;
            if (BYTES_VALUE_DESCRIPTOR_NAMES.contains(fieldDescriptor.getMessageType().getName())) {
              ByteString byteString =
                  (ByteString)
                      message.getField(message.getDescriptorForType().findFieldByName("value"));

View on GitHub (pinned to 12126d8942)