risingwavelabs/risingwave · error · SinkError::BigQuery
Column `{:?}` on RisingWave side is not found on BigQuery si
Error message
Column `{:?}` on RisingWave side is not found on BigQuery side. What it means
After the length check, `check_column_name_and_type` matches each RisingWave field to a BigQuery column by name. If a RisingWave column name has no exact match in the BigQuery table's column map, validation fails with this error identifying the missing column.
Source
Thrown at src/connector/src/sink/big_query.rs:373
big_query_columns_desc: HashMap<String, String>,
) -> Result<()> {
let rw_fields_name = self.schema.fields();
if big_query_columns_desc.is_empty() {
return Err(SinkError::BigQuery(anyhow::anyhow!(
"Cannot find table in bigquery"
)));
}
if rw_fields_name.len().ne(&big_query_columns_desc.len()) {
return Err(SinkError::BigQuery(anyhow::anyhow!(
"The length of the RisingWave column {} must be equal to the length of the bigquery column {}",
rw_fields_name.len(),
big_query_columns_desc.len()
)));
}
for i in rw_fields_name {
let value = big_query_columns_desc.get(&i.name).ok_or_else(|| {
SinkError::BigQuery(anyhow::anyhow!(
"Column `{:?}` on RisingWave side is not found on BigQuery side.",
i.name
))
})?;
let data_type_string = Self::get_string_and_check_support_from_datatype(&i.data_type)?;
if !Self::is_data_type_compatible(&i.data_type, value)? {
return Err(SinkError::BigQuery(anyhow::anyhow!(
"Data type mismatch for column `{:?}`. BigQuery side: `{:?}`, RisingWave side: `{:?}`. ",
i.name,
value,
data_type_string
)));
};
}
Ok(())
}
fn get_string_and_check_support_from_datatype(rw_data_type: &DataType) -> Result<String> {View on GitHub (pinned to 6469eb736d)
Solutions
- Rename the BigQuery column (or recreate the table) to match the RisingWave field name exactly
- Or alias the column in the sink's query/MV to the name BigQuery expects
- Recreate the sink so validation re-runs against the corrected schema
Example fix
-- before: MV column user_id but BQ table has userId -- after: CREATE MATERIZED VIEW mv AS SELECT user_id AS "userId", ... FROM ...;
Defensive patterns
Strategy: validation
Validate before calling
const rwNames = rwFields.map(f => f.name);
const bqNames = new Set(bqColumns.map(c => c.name));
const missing = rwNames.filter(n => !bqNames.has(n));
if (missing.length) throw new Error(`columns missing in BigQuery table: ${missing.join(", ")}`); Try / catch
let value = match big_query_columns_desc.get(field.name) {
Some(v) => v,
None => return Err(anyhow!("column {} missing in BigQuery table; rename or recreate table", field.name)),
}; Prevention
- Match names exactly, including case
- Alias columns in the MV to the BigQuery names
- Avoid renaming columns after the table exists without recreating the sink
When it happens
Trigger: Sink creation when column names differ due to case (BigQuery is case-insensitive but this lookup is exact), quoting/aliasing in the MV, renamed columns on either side, or reserved-word transformations.
Common situations: Renaming a column in the MV after the table existed; using camelCase in RW vs snake_case in BigQuery; accidentally lowercase/uppercase differences in the table DDL.
Understand the failure class
Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.
Related errors
- Cannot find table in bigquery
- The length of the RisingWave column {} must be equal to the
- schema invalid, record type required at top level of the sch
- PostgreSQL schema `{schema}` does not exist
- Invalid option: {message}
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/632b2eed8c16220d.
Report an issue: GitHub.