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
- Use google.protobuf.Int64Value/UInt64Value (or another supported wrapper) for integer fields instead of a custom message
- Unwrap the value yourself before building the TableRow (set a plain Long)
- Check the reported full name against the supported *_VALUE_DESCRIPTOR_NAMES lists in TableRowToStorageApiProto
- Upgrade Beam to a version that supports this wrapper type
- 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
- Emit plain Long values for INTEGER fields instead of proto wrapper messages
- Use Int64Value/UInt64Value only
- Regenerating protos: verify field types still map to supported wrappers
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
- Not implemented
- Aliased enumerations not currently supported.
- Any not yet supported
- BigQuery test was not shutdown previously. Table is
- Cannot call refreshSchema after the object has been stopped!
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)