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

  1. Rename the BigQuery column (or recreate the table) to match the RisingWave field name exactly
  2. Or alias the column in the sink's query/MV to the name BigQuery expects
  3. 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

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


AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11). Data as JSON: /api/errors/632b2eed8c16220d. Report an issue: GitHub.