Skip to content

Support attributing BigQuery quota and billing to a custom GCP project (Python, Java, Go) - #39203

Open
shahar1 wants to merge 4 commits into
apache:masterfrom
shahar1:gcp-set-quota-project-python
Open

shahar1 wants to merge 4 commits into
apache:masterfrom
shahar1:gcp-set-quota-project-python

Conversation

@shahar1

@shahar1 shahar1 commented Jul 2, 2026 •

Copy link
Copy Markdown
Contributor

Closes #37431

Adds support for attributing quota and billing of BigQuery API requests to a specific GCP project (the "quota project", i.e. the x-goog-user-project header), separate from the project the data resides in. The credentials used must have serviceusage.services.use on the quota project.

Python

  • New quota_project_id parameter on beam.io.ReadFromBigQuery (both EXPORT and DIRECT_READ), falling back to a new --quota_project_id pipeline option on GoogleCloudOptions.
  • The pipeline option is honored by the Python BigQuery IO transforms: ReadFromBigQuery, ReadAllFromBigQuery, WriteToBigQuery with FILE_LOADS / STREAMING_INSERTS, and ReadBigQueryChangeHistory. It is not yet honored by WriteToBigQuery(method=STORAGE_WRITE_API) (Java-backed; the Python option name does not translate to Java's bigQueryQuotaProjectId) nor by other GCP IOs — tracked in [Feature Request]: Honor --quota_project_id in Python GCS/Pub/Sub IO and the Java-backed BigQuery STORAGE_WRITE_API path #40555. The option's help text states this scope.
  • Mechanism: the quota project is sent as a request header / client option rather than by deriving new credentials with with_quota_project(), so the shared cached credentials are left untouched:
    • apitools BigqueryV2 client: an httplib2 wrapper below the credentials layer sets x-goog-user-project on every attempt (so it survives 401-refresh retries and wins over a quota project carried by ADC).
    • google-cloud-bigquery client (streaming inserts) and BigQueryReadClient (Storage Read API): client_options={'quota_project_id': ...}.
    • Setting quota_project_id while no credentials can be resolved raises instead of silently billing another project.
  • Every BigQueryWrapper / storage client used by these transforms is built through a single path that receives the quota project, so a call site cannot forget it. For sources that re-split on workers, the resolved value is carried as a plain attribute so it survives pickling.
  • Incidental fix on the same line: _CustomBigQueryStorageStreamSource.split() re-created the stream source without its timeout, so the per-stream read timeout was lost after a split. Now preserved.

Java

  • New --bigQueryQuotaProjectId option on BigQueryOptions (named after the existing --bigQueryProject, which controls the job parent project — a related but distinct concept).
  • Applied in BigQueryServicesImpl: the HTTP Bigquery client sets x-goog-user-project via an execute interceptor (re-applied on every attempt, since HttpCredentialsAdapter re-initializes headers after a 401 refresh); the Storage Read/Write gRPC clients set quotaProjectId on their gax settings. The HTTP job/dataset services are shared by the read and write paths, so the option covers all BigQuery API calls made by the SDK.
  • Per-transform configuration (e.g. TypedRead.withQuotaProjectId(...)) would require threading the value through the BigQueryServices interface and its fakes; left as a follow-up.

Go

  • New bigqueryio.WithQuotaProject(...) option, accepted by bigqueryio.Read (signature extended with variadic options — backward compatible) and bigqueryio.Query, applied via option.WithQuotaProject. Read rejects UseStandardSQL / WithQueryParameters with a panic, since its generated statement is legacy SQL and takes no parameters.

TypeScript

Not covered here: the TypeScript BigQuery IO delegates to the Java schemaio_bigquery_read:v1 expansion transform, so per-transform support there depends on the Java per-transform follow-up plus a BigQuerySchemaIOProvider configuration-schema change.

Testing

  • Live-tested against real GCP projects in all three SDKs (details in the PR comments): for each SDK, a read of bigquery-public-data was run on a local runner (a) without a quota project — succeeds, (b) with a quota project the caller has no serviceusage.services.use permission on — fails with USER_PROJECT_DENIED, and (c) with a quota project whose BigQuery API is disabled — fails with SERVICE_DISABLED naming the quota project, positively confirming attribution. The live tests caught (and this PR fixes) a bug where the transform-level quota_project_id did not reach the BigQuery jobs client.
  • Python: bigquery_test.py, bigquery_tools_test.py, bigquery_read_internal_test.py, bigquery_file_loads_test.py, bigquery_change_history_test.py, pipeline_options_test.py pass locally (454 tests, ~45 quota-specific), including a test that the configured quota project reaches every request through a 401 refresh even when ADC carries its own quota project.
  • Java: BigQueryServicesImplTest passes locally, including tests asserting the quota project on Storage client settings and that the header interceptor wins over a credential-set value on retry; checkstyle/spotless clean.
  • Go: unit tests and go vet pass.

Generative AI disclosure

This PR was generated end-to-end by Claude Code (Anthropic, models claude-fable-5 / claude-fable-5-1 / claude-opus-5-5) under the author's supervision: design decisions, code review, and live verification against real GCP projects were performed by the author. Commits carry Generated-by: trailers per the ASF Generative Tooling Guidance.


Thank you for your contribution! Follow this checklist to help us incorporate your contribution quickly and easily:

  • Mention the appropriate issue in your description (for example: addresses #123), if applicable. This will automatically add a link to the pull request in the issue. If you would like the issue to automatically close on merging the pull request, comment fixes #<ISSUE NUMBER> instead.
  • Update CHANGES.md with noteworthy changes.
  • If this contribution is large, please file an Apache Individual Contributor License Agreement.

See the Contributor Guide for more tips on how to make review process smoother.

🤖 Generated with Claude Code

@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request enables fine-grained control over BigQuery API billing and quota management by allowing users to specify a quota project distinct from the project where the data resides. By implementing the X-Goog-User-Project header across the primary Apache Beam SDKs, this change provides a consistent way to manage costs and API limits in multi-project environments.

Highlights

  • Cross-language support for quota project attribution: Added support for attributing BigQuery API quota and billing to a specific GCP project via the X-Goog-User-Project header across Python, Java, and Go SDKs.
  • Python SDK enhancements: Introduced a new quota_project_id parameter to ReadFromBigQuery and a corresponding --quota_project_id pipeline option in GoogleCloudOptions.
  • Java SDK enhancements: Added a --bigQueryQuotaProjectId pipeline option to BigQueryOptions and integrated it into BigQueryServicesImpl for HTTP and gRPC clients.
  • Go SDK enhancements: Added bigqueryio.WithQuotaProject option to Read and Query methods to allow flexible quota project configuration.
New Features

🧠 You can now enable Memory (public preview) to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize the Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counterproductive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution. ↩

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request adds support for attributing BigQuery API quota and billing to a specific GCP project (quota project) across the Go, Java, and Python SDKs. The changes introduce the quota_project_id parameter and pipeline option, propagating it to the underlying BigQuery and BigQuery Storage API clients, along with comprehensive unit tests. The review feedback suggests improving robustness in the Python SDK by checking if Google Auth is available before referencing its adapter to prevent potential NameErrors, and broadening the exception handling when initializing BigQuery clients with a quota project to ensure a safe fallback to default credentials in case of any loading failures.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread sdks/python/apache_beam/internal/gcp/auth.py Outdated
Comment thread sdks/python/apache_beam/io/gcp/bigquery.py Outdated
Comment thread sdks/python/apache_beam/io/gcp/bigquery_tools.py Outdated
@shahar1

shahar1 commented Jul 2, 2026

Copy link
Copy Markdown
Contributor Author

Live verification against real GCP projects (all three SDKs)

Each SDK ran the same three scenarios on a local runner, reading bigquery-public-data.usa_names.usa_1910_2013 via a query, with the pipeline/parent project set to a project I own ("project A") and the quota project varied:

Scenario Expected Python (ReadFromBigQuery(quota_project_id=...), DIRECT_READ) Java (--bigQueryQuotaProjectId, DIRECT_READ) Go (bigqueryio.WithQuotaProject)
No quota project (control) Read succeeds ✅ ✅ ✅
Quota project the caller has no serviceusage.services.use on 403 USER_PROJECT_DENIED ✅ ✅ ✅
Quota project I own, with the BigQuery API disabled SERVICE_DISABLED naming the quota project ✅ ✅ ✅

The third scenario is a positive attribution proof with zero cost: the API rejected the request as a consumer of the quota project, demonstrating the request was attributed to it rather than to project A.

Two findings from the live tests:

  1. Bug caught and fixed (commit 0f949cc): the transform-level quota_project_id in Python never reached the apitools jobs client — both sources built the client from pipeline options only, so only the --quota_project_id pipeline option worked. The live negative test initially succeeded when it should have failed, exposing this.
  2. BigQuery Storage Read API ignores x-goog-user-project: verified with a gRPC interceptor that the header is sent on the wire, yet CreateReadSession succeeds even when the quota project has the Storage API disabled. Per the Storage Read API docs, read-session quota/billing attach to the parent project of CreateReadSession (which Beam already sets from the billing project). So for DIRECT_READ, attribution of the session/streams is governed by the parent project; the quota project applies to the jobs/tables/datasets API calls (query jobs, exports, metadata), which is where the enforcement above was observed.

@shahar1

shahar1 commented Jul 2, 2026

Copy link
Copy Markdown
Contributor Author

/gemini review

@codecov

codecov Bot commented Jul 2, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 98.38710% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 56.31%. Comparing base (76f6e6d) to head (d5703b7).
⚠️ Report is 206 commits behind head on master.

Files with missing lines Patch % Lines
sdks/python/apache_beam/io/gcp/bigquery_tools.py 96.36% 2 Missing ⚠️
Additional details and impacted files
@@             Coverage Diff              @@
##             master   #39203      +/-   ##
============================================
+ Coverage     56.16%   56.31%   +0.14%     
============================================
  Files          1124      868     -256     
  Lines        178336   153607   -24729     
  Branches       1489        0    -1489     
============================================
- Hits         100170    86501   -13669     
+ Misses        75645    65261   -10384     
+ Partials       2521     1845     -676     
Flag Coverage Δ
go 28.70% <100.00%> (-0.43%) ⬇️
java ?
python 80.03% <98.05%> (+0.47%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@gemini-code-assist

Copy link
Copy Markdown
Contributor

Warning

Gemini encountered an error creating the review. You can try again by commenting /gemini review.

@shahar1

shahar1 commented Jul 2, 2026

Copy link
Copy Markdown
Contributor Author

/gemini review

@gemini-code-assist

Copy link
Copy Markdown
Contributor

Warning

Gemini encountered an error creating the review. You can try again by commenting /gemini review.

@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Assigning reviewers:

R: @shunping for label python.
R: @chamikaramj for label java.
R: @jrmccluskey for label go.

Note: If you would like to opt out of this review, comment assign to next reviewer.

Available commands:

  • stop reviewer notifications - opt out of the automated review tooling
  • remind me after tests pass - tag the comment author after tests pass
  • waiting on author - shift the attention set back to the author (any comment or push by the author will return the attention set to the reviewers)

The PR bot will only process comments in the main thread (not review comments).

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Reminder, please take a look at this pr: @shunping @chamikaramj @jrmccluskey

@github-actions

Copy link
Copy Markdown
Contributor

Assigning new set of reviewers because Pr has gone too long without review. If you would like to opt out of this review, comment assign to next reviewer:

R: @claudevdm for label python.
R: @ahmedabu98 for label java.
R: @lostluck for label go.

Available commands:

  • stop reviewer notifications - opt out of the automated review tooling
  • remind me after tests pass - tag the comment author after tests pass
  • waiting on author - shift the attention set back to the author (any comment or push by the author will return the attention set to the reviewers)

@github-actions

Copy link
Copy Markdown
Contributor

Reminder, please take a look at this pr: @claudevdm @ahmedabu98 @lostluck

@github-actions

Copy link
Copy Markdown
Contributor

Assigning new set of reviewers because Pr has gone too long without review. If you would like to opt out of this review, comment assign to next reviewer:

R: @jrmccluskey for label python.
R: @kennknowles for label java.
R: @shunping for label go.

Available commands:

  • stop reviewer notifications - opt out of the automated review tooling
  • remind me after tests pass - tag the comment author after tests pass
  • waiting on author - shift the attention set back to the author (any comment or push by the author will return the attention set to the reviewers)

@github-actions

Copy link
Copy Markdown
Contributor

Reminder, please take a look at this pr: @jrmccluskey @kennknowles @shunping

@shunping

Copy link
Copy Markdown
Collaborator

LGTM on Go implementation.

@claudevdm claudevdm left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we plumb the transform-level quota_project_id through the following BQ API calls?

bq = bigquery_tools.BigQueryWrapper.from_pipeline_options(self.options)

bq = bigquery_tools.BigQueryWrapper.from_pipeline_options(

bq = bigquery_tools.BigQueryWrapper.from_pipeline_options(

bigquery_tools.BigQueryWrapper().get_table(

Comment thread sdks/python/apache_beam/io/gcp/bigquery.py Outdated
Comment thread sdks/python/apache_beam/io/gcp/bigquery_tools.py
shahar1 added a commit to shahar1/beam that referenced this pull request Aug 21, 2026
Two unresolved review comments from claudevdm on apache#39203:

1. Don't fall back when the user explicitly asked for a quota project.
   `auth.with_quota_project` now raises instead of warning-and-ignoring, and
   the BigQuery Storage / google-cloud-bigquery client factories no longer
   swallow credential errors. Silently falling back bills a different project
   than the one requested, which is the exact thing the option exists to
   control.

2. Passing `client=` to override both `self.client` (apitools BigqueryV2) and
   `self.gcp_bq_client` (google-cloud-bigquery Client) was error prone.
   `BigQueryWrapper` now takes `pipeline_options`/`quota_project_id` (both
   keyword-only, so the existing positional signature is unchanged) and builds
   both clients itself, with `client`/`gcp_client` as separate test-only
   overrides. `gcp_bq_client` is created on first use, since only the streaming
   insert path needs it.

Production call sites no longer pass `client=`: both read sources build every
wrapper through a `_create_bq_wrapper` helper, so quota attribution cannot be
forgotten at an individual call site. That also fixes two call sites that
silently ignored the transform-level `quota_project_id`: `estimate_size` in
both sources, and the table schema lookup that `output_type='BEAM_ROW'`
performs.

Generated-by: Claude Code (claude-opus-5)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R4ARQfZ9k9G9YG2WESgV7u
shahar1 added a commit to shahar1/beam that referenced this pull request Aug 21, 2026
Two unresolved review comments from claudevdm on apache#39203:

1. Don't fall back when the user explicitly asked for a quota project.
   `auth.with_quota_project` now raises instead of warning-and-ignoring, and
   the BigQuery Storage / google-cloud-bigquery client factories no longer
   swallow credential errors. Silently falling back bills a different project
   than the one requested, which is the exact thing the option exists to
   control.

2. Passing `client=` to override both `self.client` (apitools BigqueryV2) and
   `self.gcp_bq_client` (google-cloud-bigquery Client) was error prone.
   `BigQueryWrapper` now takes `pipeline_options`/`quota_project_id` (both
   keyword-only, so the existing positional signature is unchanged) and builds
   both clients itself, with `client`/`gcp_client` as separate test-only
   overrides. `gcp_bq_client` is created on first use, since only the streaming
   insert path needs it.

Production call sites no longer pass `client=`: both read sources build every
wrapper through a `_create_bq_wrapper` helper, so quota attribution cannot be
forgotten at an individual call site. That also fixes two call sites that
silently ignored the transform-level `quota_project_id`: `estimate_size` in
both sources, and the table schema lookup that `output_type='BEAM_ROW'`
performs.

Generated-by: Claude Code (claude-opus-5)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R4ARQfZ9k9G9YG2WESgV7u
@shahar1
shahar1 force-pushed the gcp-set-quota-project-python branch from 8c34256 to 70be9f9 Compare August 21, 2026 07:22
@shahar1
shahar1 requested a review from claudevdm August 21, 2026 07:25
@github-actions

Copy link
Copy Markdown
Contributor

Reminder, please take a look at this pr: @jrmccluskey @kennknowles @shunping @claudevdm

@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Assigning new set of reviewers because Pr has gone too long without review. If you would like to opt out of this review, comment assign to next reviewer:

R: @damccorm for label python.
R: @ahmedabu98 for label java.
R: @lostluck for label go.

Available commands:

  • stop reviewer notifications - opt out of the automated review tooling
  • remind me after tests pass - tag the comment author after tests pass
  • waiting on author - shift the attention set back to the author (any comment or push by the author will return the attention set to the reviewers)

Comment thread sdks/python/apache_beam/io/gcp/bigquery_read_internal.py Outdated
Comment thread sdks/python/apache_beam/internal/gcp/auth.py Outdated
@damccorm

damccorm commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

R: @claudevdm (keeping this sticky)

@damccorm

damccorm commented Sep 4, 2026 •

Copy link
Copy Markdown
Contributor

waiting on author

@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Stopping reviewer notifications for this pull request: review requested by someone other than the bot, ceding control. If you'd like to restart, comment assign set of reviewers

@shahar1
shahar1 requested a review from claudevdm September 13, 2026 08:12
@shahar1

shahar1 commented Sep 17, 2026

Copy link
Copy Markdown
Contributor Author

@claudevdm would you mind taking another look? Thank you :)

@claudevdm claudevdm left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you please fix merge conflicts? Otherwise I think this looks good.

@shahar1

shahar1 commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor Author

Can you please fix merge conflicts? Otherwise I think this looks good.

Thank you, fixed and made some last changes.
Once approved, would you like me to squash and reorder commits before merging?

Edit: CI fails, I'll investigate and fix

CC: @iemejia

shahar1 added a commit to shahar1/beam that referenced this pull request Oct 13, 2026
Two unresolved review comments from claudevdm on apache#39203:

1. Don't fall back when the user explicitly asked for a quota project.
   `auth.with_quota_project` now raises instead of warning-and-ignoring, and
   the BigQuery Storage / google-cloud-bigquery client factories no longer
   swallow credential errors. Silently falling back bills a different project
   than the one requested, which is the exact thing the option exists to
   control.

2. Passing `client=` to override both `self.client` (apitools BigqueryV2) and
   `self.gcp_bq_client` (google-cloud-bigquery Client) was error prone.
   `BigQueryWrapper` now takes `pipeline_options`/`quota_project_id` (both
   keyword-only, so the existing positional signature is unchanged) and builds
   both clients itself, with `client`/`gcp_client` as separate test-only
   overrides. `gcp_bq_client` is created on first use, since only the streaming
   insert path needs it.

Production call sites no longer pass `client=`: both read sources build every
wrapper through a `_create_bq_wrapper` helper, so quota attribution cannot be
forgotten at an individual call site. That also fixes two call sites that
silently ignored the transform-level `quota_project_id`: `estimate_size` in
both sources, and the table schema lookup that `output_type='BEAM_ROW'`
performs.

Generated-by: Claude Code (claude-opus-5)
Claude-Session: https://claude.ai/code/session_01R4ARQfZ9k9G9YG2WESgV7u
@shahar1
shahar1 force-pushed the gcp-set-quota-project-python branch 3 times, most recently from 92d071c to 3fea05b Compare October 16, 2026 14:25
Add a quota_project_id parameter to ReadFromBigQuery and a
--quota_project_id pipeline option (GoogleCloudOptions) that attribute
BigQuery API quota and billing to a project other than the one the data
resides in.

The quota project is sent as the x-goog-user-project header on the
apitools BigQuery client, and through client_options on the
google-cloud-bigquery Client (streaming inserts) and the BigQuery
Storage Read client. The shared pipeline credentials are left untouched
instead of being copied with with_quota_project(), which for some
credential types drops the cached token. The header is only added to
requests to the BigQuery API hosts: the credentials refresh their token
through the same Http, and the token endpoint, metadata server and IAM
Credentials API must not receive it.

It is honored by ReadFromBigQuery (EXPORT and DIRECT_READ, including
temporary dataset cleanup), ReadAllFromBigQuery, WriteToBigQuery with
FILE_LOADS or STREAMING_INSERTS, and ReadBigQueryChangeHistory. The
value is resolved once at expand() time and passed to each DoFn so it
reaches separately deserialized SDF copies. STORAGE_WRITE_API is
Java-backed and not covered yet.

Generated-By: Claude Opus 5.5 <noreply@anthropic.com>
Add BigQueryOptions.bigQueryQuotaProjectId to attribute BigQuery API
quota and billing to a project other than the one the data resides in.

For the REST client, the x-goog-user-project header is set by an
execute interceptor, so it is re-applied on every attempt, including
after HttpCredentialsAdapter re-initializes headers on a 401 refresh.
The Storage Read and Write clients set it through setQuotaProjectId.

Generated-By: Claude Opus 5.5 <noreply@anthropic.com>
Add a WithQuotaProject query option that attributes BigQuery API quota
and billing to a project other than the one the data resides in, via
option.WithQuotaProject on the BigQuery client.

Read now accepts query options too. Only WithQuotaProject applies to it;
UseStandardSQL and WithQueryParameters panic, because Read generates a
legacy SQL statement without parameters.

Generated-By: Claude Opus 5.5 <noreply@anthropic.com>
Generated-By: Claude Opus 5.5 <noreply@anthropic.com>
@shahar1
shahar1 force-pushed the gcp-set-quota-project-python branch from 3fea05b to d5703b7 Compare October 16, 2026 14:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature Request]: Set quota project in beam.io.ReadFromBigQuery

5 participants