apache/beam · error · ValueError

Unsupported method

Error message

Unsupported method {method_to_use}

What it means

WriteToBigQuery.expand() exhausts its known write methods (STREAMING_INSERTS, FILE_LOADS, STORAGE_WRITE_API, STORAGE_API_AT_LEAST_ONCE, etc.) and raises ValueError for anything else. The method value passed the constructor but did not map to an implementation branch.

Solutions

  1. Use one of WriteToBigQuery.Method.STREAMING_INSERTS, FILE_LOADS, or STORAGE_WRITE_API enum values.
  2. Upgrade apache-beam to a version that supports the desired method.
  3. Validate the method value before constructing the transform.

Example fix

// before
WriteToBigQuery(table='proj:ds.tbl', method='STORAGE-API')
// after
WriteToBigQuery(table='proj:ds.tbl', method=WriteToBigQuery.Method.STORAGE_WRITE_API)
Defensive patterns

Strategy: validation

Validate before calling

from apache_beam.io.gcp.bigquery import WriteToBigQuery
valid = set(WriteToBigQuery.Method)
assert method in valid or method in {m.value for m in valid}, f'unsupported method {method}'

Prevention

When it happens

Trigger: Passing method= an unrecognized string or an unsupported Method enum value to WriteToBigQuery and expanding the pipeline.

Common situations: Typo in method string (e.g. 'STOARGE_WRITE_API'); using a method added in a newer Beam version while running an older one; building the method name dynamically.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


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

Appendix: source

Thrown at sdks/python/apache_beam/io/gcp/bigquery.py:2490

    elif method_to_use == WriteToBigQuery.Method.STORAGE_WRITE_API:
      return pcoll | StorageWriteToBigQuery(
          table=self.table_reference,
          schema=self.schema,
          table_side_inputs=self.table_side_inputs,
          create_disposition=self.create_disposition,
          write_disposition=self.write_disposition,
          additional_bq_parameters=self.additional_bq_parameters,
          triggering_frequency=self.triggering_frequency,
          use_at_least_once=self.use_at_least_once,
          with_auto_sharding=self.with_auto_sharding,
          num_storage_api_streams=self._num_storage_api_streams,
          use_cdc_writes=self._use_cdc_writes,
          primary_key=self._primary_key,
          big_lake_configuration=self._big_lake_configuration,
          expansion_service=self.expansion_service,
          type_overrides=self._type_overrides)
    else:
      raise ValueError(f"Unsupported method {method_to_use}")

  def display_data(self):
    res = {}
    if self.table_reference is not None and isinstance(self.table_reference,
                                                       TableReference):
      tableSpec = '{}.{}'.format(
          self.table_reference.datasetId, self.table_reference.tableId)
      if self.table_reference.projectId is not None:
        tableSpec = '{}:{}'.format(self.table_reference.projectId, tableSpec)
      res['table'] = DisplayDataItem(tableSpec, label='Table')

    res['validation'] = DisplayDataItem(
        self._validate, label="Validation Enabled")
    return res

  def to_runner_api_parameter(self, context):
    from apache_beam.internal import pickler

View on GitHub (pinned to 12126d8942)