apache/beam · error · IllegalArgumentException
Schema must contain at least one field. Schema: %s
Error message
Schema must contain at least one field. Schema: %s
What it means
PubsubRowToMessage.validate() requires the input Beam Schema to contain at least one field. A zero-field schema cannot be converted into a Pubsub message, so validation throws an IllegalArgumentException including the offending schema.
Source
Thrown at sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubRowToMessage.java:178
String getAttributesKeyName() {
return getKeyPrefix() + ATTRIBUTES_KEY_NAME;
}
/** Returns the name of the source timestamp key, prefixed with {@link #getKeyPrefix()}. */
String getSourceEventTimestampKeyName() {
return getKeyPrefix() + EVENT_TIMESTAMP_KEY_NAME;
}
/** Returns the name of the source payload key, prefixed with {@link #getKeyPrefix()}. */
String getPayloadKeyName() {
return getKeyPrefix() + PAYLOAD_KEY_NAME;
}
/** Validates an input's {@link Schema} for correctness. */
void validate(Schema schema) {
if (schema.getFieldCount() == 0) {
throw new IllegalArgumentException(
String.format("Schema must contain at least one field. Schema: %s", schema));
}
validateAttributesField(schema);
validateSourceEventTimeStampField(schema);
validateSerializableFields(schema);
}
/**
* Validates an input's {@link Schema} for its {@link #getAttributesKeyName()} field correctness,
* if exists.
*/
void validateAttributesField(Schema schema) {
String attributesKeyName = getAttributesKeyName();
if (!schema.hasField(attributesKeyName)) {
return;
}
checkArgument(View on GitHub (pinned to 12126d8942)
Solutions
- Add at least one field to the input schema before applying PubsubRowToMessage.
- Check that the schema source (Avro/JSON schema string, Schema.builder()) actually produced fields.
- Ensure no upstream transform is stripping all fields from the PCollection's schema.
Example fix
// before
Schema schema = Schema.builder().build(); // 0 fields
// after
Schema schema = Schema.builder().addStringField("payload").build(); Defensive patterns
Strategy: validation
Validate before calling
if (input.getSchema().getFieldCount() == 0) { throw new IllegalArgumentException("Input schema has no fields; add at least one before PubsubRowToMessage"); } Try / catch
try { rowToMessage.expand(input); } catch (IllegalArgumentException e) { if (e.getMessage().contains("at least one field")) { /* rebuild schema with fields */ } throw e; } Prevention
- After building any Schema programmatically, assert getFieldCount() > 0 before use.
- Validate parsed Avro/JSON schemas actually produced fields.
When it happens
Trigger: Applying PubsubRowToMessage (via expand()) with an input PCollection whose Schema has getFieldCount() == 0 — e.g. an empty schema was parsed or a Row collection with no fields was piped in.
Common situations: Building the schema programmatically and forgetting to add fields; parsing an empty or malformed Avro/JSON schema that yields zero fields; upstream transforms that drop all columns.
Understand the failure class
Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.
Related errors
- serializable Row does not exist for payload of type: %s
- Unsupported schema specified for Pubsub source in CREATE TAB
- Unsupported schema specified for Pubsub source in CREATE TAB
- Configuration schema provided does not match expected
- Cannot provide a coder for a Beam Row. Please provide a sche
AI-assisted analysis of apache/beam@12126d8942 (2026-09-13).
Data as JSON: /api/errors/ac939c583bd96e80.
Report an issue: GitHub.