<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Data Analytics</title><link>https://cloud.google.com/blog/products/data-analytics/</link><description>Data Analytics</description><atom:link href="https://cloudblog.withgoogle.com/blog/products/data-analytics/rss/" rel="self"></atom:link><language>en</language><lastBuildDate>Thu, 29 Oct 2026 16:00:04 +0000</lastBuildDate><image><url>https://cloud.google.com/blog/products/data-analytics/static/blog/images/google.a51985becaa6.png</url><title>Data Analytics</title><link>https://cloud.google.com/blog/products/data-analytics/</link></image><item><title>Querying Databricks Apache Iceberg Tables with the borderless Lakehouse</title><link>https://cloud.google.com/blog/products/data-analytics/querying-databricks-iceberg-tables-with-google-clouds-lakehouse/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;Enterprise organizations often leverage multiple data platforms, including Databricks, to execute heavy Apache Spark jobs alongside BigQuery to power highly concurrent analytics workloads. Historically, bridging these systems often meant building complex pipelines to copy data between environments. This approach increases storage costs, introduces latency, and fragments security controls.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;With Google Cloud’s borderless Lakehouse, you can now query Databricks-managed Apache Iceberg tables straight from BigQuery. This zero-copy approach removes the need to duplicate data: BigQuery reads the same files Databricks writes, and new changes appear after Lakehouse's next scheduled metadata refresh (as often as every 5 minutes).&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/image1_9nWgq7s.max-1000x1000.jpg"
        
          alt="image1"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h4 style="text-align: justify;"&gt;&lt;strong style="vertical-align: baseline;"&gt;How Lakehouse and Databricks work together&lt;/strong&gt;&lt;/h4&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;Managed Iceberg tables automatically generates Iceberg-compatible metadata alongside native Delta logs. Data engineering teams can store Parquet files once in Google Cloud Storage (GCS) using Databricks. Rather than loading this information into BigQuery, Lakehouse reads the Iceberg metadata directly, applying BigQuery’s vectorized engine directly to open-format files in GCS.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;Although Google Cloud Storage (GCS) serves as the primary storage layer in the above example, Lakehouse extends this borderless federation directly to external cloud environments like Amazon S3 and Azure Blob Storage. By pairing the open Apache Iceberg REST Catalog with cross-cloud connections, Lakehouse lets BigQuery query data across clouds without moving it. Each federated catalog lives in a Google Cloud location you choose, ideally the region closest to your data. This lets BigQuery read open-format Parquet files where they live, delivering multi-cloud analytics without replication pipelines. Remote-cloud egress charges still apply, but Cross-Cloud Interconnect (AWS) and Lakehouse caching can reduce them.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;Beyond simply querying external data, Lakehouse framework establishes true read and write (R/W) interoperability across engines. Because the platform is built on an open Apache Iceberg foundation, data teams can effortlessly execute multi-statement SQL commands directly inside BigQuery.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style="text-align: justify;"&gt;&lt;strong style="vertical-align: baseline;"&gt;Centralized security and governance&lt;/strong&gt;&lt;/h4&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;Handling access controls across disparate systems can introduce vulnerabilities. Lakehouse addresses this through delegated access. Administrators can configure a BigQuery Cloud Resource Connection tied to a service account that manages IAM rights for GCS buckets. Granting users access to the Lakehouse table entity lets you enforce BigQuery controls including row-level, column-level security, and dynamic data masking on external Iceberg tables while Databricks handles ingestion.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style="text-align: justify;"&gt;&lt;strong style="vertical-align: baseline;"&gt;Catalog federation and credential vending&lt;/strong&gt;&lt;/h4&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;Previously, connecting these platforms meant manually configuring BigQuery queries to point at static metadata paths. Modern setups leverage the open Apache Iceberg REST Catalog API. Databricks Unity Catalog functions as the central metadata layer, allowing a BigQuery administrator to establish a Lakehouse runtime catalog with a federated connection. When running a query, Lakehouse contacts Unity Catalog for current table state, and short-lived tokens are issued through credential vending to grant BigQuery temporary read access to GCS.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style="text-align: justify;"&gt;&lt;strong style="vertical-align: baseline;"&gt;Partition pruning&lt;/strong&gt;&lt;/h4&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;BigQuery uses each table's Iceberg metadata to plan the query, then reads only the relevant data files in place. Iceberg's hidden partitioning lets you filter on logical columns, such as timestamps, without knowing the directory layout. Note that Databricks managed Iceberg tables don't support partition transforms; Databricks recommends liquid clustering instead.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;Filters in a standard WHERE clause let BigQuery use the Iceberg manifests to skip partitions that can't match. Compare partition columns with literal values so pruning can apply. These manifests maintain detailed column-level statistical bounds, enabling BigQuery to bypass irrelevant manifest records and unneeded Parquet files immediately. Consequently, queries scan only necessary byte ranges, accelerating query execution while significantly reducing on-demand slot consumption and storage scan costs.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style="text-align: justify;"&gt;&lt;strong style="vertical-align: baseline;"&gt;Fast queries with Iceberg metadata and Lakehouse caching&lt;/strong&gt;&lt;/h4&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;Iceberg manifests already identify which data files to read, so BigQuery doesn't need a metadata cache for Iceberg tables. For cross-cloud tables, such as those in Amazon S3, Lakehouse caching (Preview) keeps retrieved data blocks in Google Cloud so repeat queries read them locally. BigQuery reads the Iceberg manifest files directly when it plans each query; there's no metadata caching to enable. This dynamic partition pruning bypasses unneeded files, significantly reducing runtime and bytes scanned.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style="text-align: justify;"&gt;&lt;strong style="vertical-align: baseline;"&gt;Maintenance and lifecycle management&lt;/strong&gt;&lt;/h4&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;Modern lakehouses demand active upkeep; without routine care, performance degrades into an inefficient repository. Fortunately, both BigQuery and Databricks supply native capabilities to preserve table hygiene and accelerate analytical workloads.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style="text-align: justify;"&gt;&lt;strong style="vertical-align: baseline;"&gt;Keeping your tables optimized&lt;/strong&gt;&lt;/h4&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;To maintain optimal query performance, active maintenance of your lakehouse storage footprint remains necessary.&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation" style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;Trigger regular compaction pipelines via Databricks APIs to merge tiny Parquet files into larger, optimized layouts and use Predictive Optimization.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation" style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;Execute the Databricks VACUUM command to clear unreferenced files outside active snapshots, avoiding extra GCS storage costs.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style="text-align: justify;"&gt;&lt;strong style="vertical-align: baseline;"&gt;Compaction and the small file problem&lt;/strong&gt;&lt;/h4&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;Frequent write operations, continuous ingestion jobs, and streaming workloads continuously produce thousands of small Parquet files. This fragmentation creates a storage bottleneck that can limit BigQuery’s reading efficiency. Establishing thousands of network connections to GCS and processing metadata footers across numerous tiny files consumes significant compute time, diminishing the performance advantages of vectorized query execution.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;Running routine compaction within Iceberg resolves these inefficiencies. Databricks manages this automatically using Liquid Clustering which dynamically adjusts file layouts based on access patterns or through native table management utilities.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;To compact small files manually on Databricks, run OPTIMIZE:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;-- Run on Databricks to compact small files\r\n-- On Databricks:\r\nOPTIMIZE customer_events;\r\n-- For Iceberg tables you manage outside Databricks:\r\nCALL my_catalog.system.rewrite_data_files(\r\ntable =&amp;gt; &amp;#x27;default.customer_events&amp;#x27;,\r\nstrategy =&amp;gt; &amp;#x27;binpack&amp;#x27;,\r\noptions =&amp;gt; map(\r\n&amp;#x27;target-file-size-bytes&amp;#x27;,\r\n&amp;#x27;268435456&amp;#x27;,\r\n&amp;#x27;min-file-size-bytes&amp;#x27;,\r\n&amp;#x27;67108864&amp;#x27;\r\n)\r\n);&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8a8a6e650&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;Executing this command aggregates scattered file segments into larger, structured blocks typically between 256MB and 512MB that can help improve BigQuery’s scan throughput. The binpack approach operates rapidly by prioritizing total file size balancing, though alternative sorting strategies can organize dataset ordering along specific column keys.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style="text-align: justify;"&gt;&lt;strong style="vertical-align: baseline;"&gt;Managing orphan files and snapshot retention (VACUUM)&lt;/strong&gt;&lt;/h4&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;Every transactional update, record modification, and table compaction creates fresh snapshots within Iceberg to preserve dataset integrity. Over time, historical Parquet objects detached from active table states become orphaned. Although these legacy files facilitate time-travel analytics, neglecting them can drive up GCS storage charges over time.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;Data teams can use the Databricks VACUUM operation to scan and purge abandoned storage files.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;ALTER TABLE customer_events SET TBLPROPERTIES (&amp;#x27;delta.deletedFileRetentionDuration&amp;#x27; = &amp;#x27;7 days&amp;#x27;);\r\nVACUUM customer_events FULL;&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8a9195490&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;Standard configurations apply a mandatory seven-day threshold (deletedFileRetentionDuration) before executing VACUUM routines. Preserving this delay prevents active analytical jobs from encountering missing file errors while keeping historical recovery options available. Scheduling routine VACUUM jobs, or letting predictive optimization run them, removes unreferenced data files and, for tables with Iceberg reads, old Iceberg metadata. That keeps storage costs low and performance high across your lakehouse.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style="text-align: justify;"&gt;&lt;strong style="vertical-align: baseline;"&gt;Conclusion&lt;/strong&gt;&lt;/h4&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;Connecting Databricks Apache Iceberg datasets to Lakehouse can help you activate your data with BigQuery. By separating processing from underlying storage, embracing open formats, and using standard REST APIs with credential vending, you can run scalable engineering workloads and concurrent analytics without migrating data or sacrificing performance&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;Pairing Databricks Iceberg reads (UniForm) with Lakehouse federation, Lakehouse caching, and regular OPTIMIZE and VACUUM maintenance helps you build an efficient, zero-copy lakehouse. This approach can help lower storage spend, avoids fragile pipeline maintenance, and prepares your data environment for modern analytics and emerging AI workloads.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="vertical-align: baseline;"&gt;Constructing a unified architecture no longer requires moving data files across platforms. You can begin querying Databricks Iceberg tables by registering them with the Lakehouse runtime catalog today for bi-directional federation. Learn more by reading our &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/lakehouse/docs/set-up-cross-cloud-connection-databricks"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;documentation&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to get started.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Thu, 29 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/data-analytics/querying-databricks-iceberg-tables-with-google-clouds-lakehouse/</guid><category>Data Analytics</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Querying Databricks Apache Iceberg Tables with the borderless Lakehouse</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/data-analytics/querying-databricks-iceberg-tables-with-google-clouds-lakehouse/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Pramod Niralakeri</name><title>Strategic Cloud Engineer</title><department></department><company></company></author></item><item><title>Grounding agents in one context graph connecting semantic models you already trust</title><link>https://cloud.google.com/blog/products/data-analytics/expanded-semantic-model-support-in-knowledge-catalog/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Picture the scene: Before an executive business review, your VP of Sales asks an AI assistant, &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;"What was net revenue for our top enterprise accounts last quarter?"&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; In seconds, the agent returns a polished chart! Unfortunately, the numbers don't match the finance report. Why? Because the agent counted cancelled orders as revenue and pulled from an unvalidated staging table.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The agent didn't fail because of the model, or because it couldn't translate a user question into a query. It failed because &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;it didn't understand your business&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;. The real kicker is that understanding usually already exists in the form of a semantic model in a Looker, dbt, Snowflake, Databricks, or SAP system. But because each definition stays locked inside its own tool, every agent guesses at it… and often gets it wrong. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This is where &lt;/span&gt;&lt;a href="https://cloud.google.com/products/knowledge-catalog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Knowledge Catalog&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; comes in. It brings the semantic models from all of those tools into one context graph, so every agent works from the same trusted definitions. And when two tools define the same metric differently, both definitions appear with their provenance, so data stewards can reconcile the conflict before it reaches end users.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Today, we're announcing the general availability of expanded semantic model support. Knowledge Catalog now natively ingests semantic models and metric definitions from Looker LookML, BigQuery Graph (including BigQuery measures), dbt MetricFlow, Snowflake Semantic Views, Databricks Metric Views, and SAP Core Schema Notation (CSN), and connects them with schema, lineage, data profiles, business glossary and other key metadata in a single context graph, without moving data or rewriting business logic in a new language. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;By grounding your AI agents in those models, they get the same business definitions your analysts rely on, so their answers line up with the numbers your business trusts. In fact, based on internal benchmarks, grounding agents in Knowledge Catalog makes them nearly 4X more accurate, with up to 33% lower latency, and using up to 75% fewer tokens.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The unified context graph enables you to:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Reuse the semantic models you already trust:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Knowledge Catalog grounds &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/gemini/enterprise/docs/connectors/connect-knowledge-catalog#configure-knowledge-catalog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Gemini &lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;agent, BigQuery Conversational Analytics, and your custom agents in the metrics, filters, and join paths your teams have already defined, wherever they live.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Go beyond hand-curated definitions with self-learned context: &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Knowledge Catalog pairs the well-defined metrics and KPI definitions in your semantic models with relevant context it extracts from unstructured knowledge sources, such as operational playbooks, meeting notes, chat threads, code, and more. Powered by Gemini, &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/knowledge-catalog-self-learning-context-enrichment-for-ai-agents?e=48754805"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;self-learning enrichment&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; continuously finds missing or outdated context and turns it into governed, reusable context sets, ensuring your agents' context stays current as definitions change, without relying only on manual curation.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Pair business logic with enterprise trust: &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Even the right formula produces the wrong answer when it runs on stale or uncertified data. That's why Knowledge Catalog can connect semantic definition to data quality scores, freshness signals, and lineage, so an agent knows what it can trust before it writes a line of SQL.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/1._Side-by-side_comparison_z1p0n9c.gif"
        
          alt="1. Side-by-side comparison"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="byygb"&gt;Side-by-side comparison of the same question in Gemini without Knowledge Catalog (left) and grounded in Knowledge Catalog (right). Highlights the grounded agent (right) giving an accurate response with less token and lower latency, compared to the agent without Knowledge Catalog (left) hallucinating and using more tokens with higher latency.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;One context graph across your data estate&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The context graph that Knowledge Catalog creates is a connected map of your data and semantic estate: tables, semantic models, glossary terms, and data products are nodes; lineage, associations, schema keys, joins mined from real query history, and the join paths declared in your semantic models are the edges. Ingested semantics land in that same graph, next to pre-existing governance and usage signals, so an agent moves from business concept to trusted formula and verified join paths in one traversal. Each source adds its own perspective on your business:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/looker/docs/looker-core-dataplex"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Looker LookML&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt; (GA):&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Indexes models, explores, views, and dashboards using Live sync from Looker Core, capturing compiled metric SQL, fan-out-safe join conditions, mandatory filters, and lineage from source tables to executive dashboards.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/knowledge-catalog/docs/metadata-overview#supported-sources"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;BigQuery Graph&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt; (GA):&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Indexes native property-graph definitions, node and edge tables, graph measures, and business synonyms, so agents reason over connected entities with Graph Query Language (GQL) traversals instead of brittle multi-table self-joins.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/knowledge-catalog/docs/dbt-transfer"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;dbt MetricFlow&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt; (GA):&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Links source objects to dbt models and MetricFlow metrics, alongside dbt data quality test results, filters, saved queries, freshness SLAs, and downstream exposures.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/knowledge-catalog/docs/snowflake-horizon-transfer"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Snowflake Semantic Views via Horizon Catalog&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt; (GA):&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Pairs federated BigQuery or Google Cloud Lakehouse tables with Snowflake Horizon metadata, bringing in Semantic View dimensions, facts, metric formulas, relationships, and synonyms, plus Data Metric Function quality scorecards and PII masking tags.&lt;/span&gt;&lt;/li&gt;
&lt;li role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/knowledge-catalog/docs/databricks-unity-transfer"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Databricks Metric Views via Unity Catalog&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt; (GA):&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Ingests metric view definitions, measure formulas, scoping filters, and join cardinalities from Unity Catalog, alongside table certification badges and Lakehouse Monitoring profiling results.&lt;/span&gt;&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/knowledge-catalog/docs/manage-sap-bdc-metadata"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;SAP Core Schema Notation (CSN) via SAP Business Data Cloud (BDC)&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt; (GA):&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Captures business labels, dimension and cube modeling patterns, default aggregations, currency and unit bindings, key and composite join associations, and data sensitivity flags when SAP BDC Data Products are federated through Google Cloud Lakehouse.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Because every source lands as a node or an edge in the same graph, a LookML join, a dbt exposure, a Snowflake relationship, or an SAP association are traversable side by side, with links tying each one back to the physical tables it depends on. And nothing is silently overwritten: overlapping definitions stay side by side, each labeled with its source, giving data stewards the full picture they need to settle on a single version.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/2._Context_Graphs.gif"
        
          alt="2. Context Graphs_compressed"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="byygb"&gt;Navigating semantic models, join paths, and lineage on the context graph in Knowledge Studio.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;You can explore and govern all of this in &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/knowledge-catalog/docs/knowledge-studio"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Knowledge Studio&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; (preview), your command center to explore and manage your context. Explore your context graph, including your semantic definitions, using natural language prompts and traverse connection paths using the context graph canvas. Then, once you've validated the right assets and definitions, you can package them into reusable &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/knowledge-catalog/docs/context-sets"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;context sets&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; that map to specific use cases and domains in your organization, which Gemini and custom agents can consume in production.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Get started&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Let’s get back to that net revenue question. With Knowledge Catalog, the VP of Sales’ agent issues a single context query to discover the trusted asset, applying the exact metric formula and filters that your domain experts defined, all while respecting join keys across systems, and confirming that the underlying data passed its quality checks. Better yet, the numbers in the report are correct!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To get started, explore your context graph in &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/knowledge-catalog/docs/knowledge-studio"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Knowledge Studio&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and visit the &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/knowledge-catalog/docs"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Knowledge Catalog documentation&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to connect to more sources.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Thu, 29 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/data-analytics/expanded-semantic-model-support-in-knowledge-catalog/</guid><category>Data Analytics</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Grounding agents in one context graph connecting semantic models you already trust</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/data-analytics/expanded-semantic-model-support-in-knowledge-catalog/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Maggy Hu</name><title>Product Manager</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Paulina Trzeciak</name><title>Product Manager</title><department></department><company></company></author></item><item><title>What’s new with Google Data Cloud</title><link>https://cloud.google.com/blog/products/data-analytics/whats-new-with-google-data-cloud/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;October 19 - October 23&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;BigQuery introduces column aliases in GoogleSQL and cross-region table copy GA&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;GoogleSQL in BigQuery now supports column aliases in &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;SELECT&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;WHERE&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; clauses (GA opt-in), avoiding nested subqueries and simplifying migrations from Snowflake and Teradata. Cross-region table copying is also now generally available to streamline regional data replication and disaster recovery. &lt;/span&gt;&lt;a href="https://cloud.google.com/bigquery/docs/release-notes"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Review the BigQuery release notes&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Conversational analytics in BigQuery expands to Canada and adds CSV/PDF export&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Conversational analytics in BigQuery is now available in Montréal (&lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;northamerica-northeast1&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;) and Toronto (&lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;northamerica-northeast2&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;) to support Canadian data residency requirements. You can also now export agent responses — including text, tables, charts, and citations — directly to CSV or PDF (GA). &lt;/span&gt;&lt;a href="https://cloud.google.com/bigquery/docs/conversational-analytics"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Learn more about conversational analytics in BigQuery&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;AlloyDB Omni 18.4.0 is now GA with Advanced Query Insights and external KMS support&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;AlloyDB Omni 18.4.0 brings PostgreSQL 18.4 to self-hosted and multi-cloud environments, adding the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;google_insights_v2&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; extension for granular query execution and wait-event diagnostics. It also adds Thales CipherTrust Manager support for Transparent Data Encryption (TDE) alongside HashiCorp Vault. &lt;/span&gt;&lt;a href="https://cloud.google.com/alloydb/docs/omni/release-notes"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Explore the AlloyDB Omni release notes&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Cloud SQL for PostgreSQL adds managed connection pooling and Private Service Connect defaults&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Cloud SQL for PostgreSQL now supports enabling built-in managed connection pooling on existing Private Service Connect (PSC) instances to scale high-concurrency workloads. PSC is also now the default private IP option for new Cloud SQL instances in new projects to simplify cross-project networking. &lt;/span&gt;&lt;a href="https://cloud.google.com/sql/docs/postgres/release-notes"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Review Cloud SQL updates&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Customer momentum: Unico prevents over $5B in fraud on Google's Agentic Data Cloud&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Digital identity platform Unico migrated from Databricks Spark/Scala clusters to BigQuery and Spanner at the core of its data architecture. Unifying real-time transaction streams with petabyte-scale analytics enabled low-latency identity verification that has prevented over $5 billion in fraud. &lt;/span&gt;&lt;a href="https://cloud.google.com/customers/unico"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Read the Unico case study&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Developer guide: Getting started with Looker Data Apps&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Following the debut of Looker Data Apps in preview, a new walkthrough on the Google Developer Community shares practical patterns for building prompt-driven applications inside Looker. &lt;/span&gt;&lt;a href="https://discuss.google.dev/t/why-i-m-obsessed-with-looker-data-apps-with-tips-to-get-you-started/404116" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Read the guide on the Google Developer Community&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;October 12 - October 16&lt;/h3&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Looker Data Apps are now in Preview to build and host interactive, agent-generated applications natively inside Looker&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Generated using natural language prompts, the Antigravity CLI, or Claude Code, these interactive web applications, &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;natively hosted inside Looker,&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; transform business reporting into operational systems of action. Users can test scenarios, adjust parameters, and trigger workflows in downstream platforms while inheriting LookML semantic modeling, row-level security, and access controls with no runtime LLM token costs.&lt;/span&gt; &lt;a href="https://cloud.google.com/blog/products/business-intelligence/introducing-looker-data-apps"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Read the announcement blog&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Build end-to-end data science pipelines with the Data Agent Kit&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Following the general availability of the &lt;/span&gt;&lt;a href="https://cloud.google.com/products/data-agent-kit"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Data Agent Kit&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, a new end-to-end walkthrough demonstrates how data teams can build, test, and schedule machine learning pipelines directly from their preferred code editors.&lt;/span&gt; &lt;a href="https://cloud.google.com/blog/products/data-analytics/bringing-you-the-data-agent-kit"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Explore the walkthrough and codelab&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Manage dashboard agents as code to bring CI/CD and version control to LookML dashboards&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Data teams can now declare agent parameters, configurations, and prompt instructions alongside dashboard files in code. This integration enables standard developer workflows for conversational BI, including Git version control, peer review, branching, and automated CI/CD validation before agent modifications reach production end users.&lt;/span&gt; &lt;a href="https://discuss.google.dev/t/manage-dashboard-agents-as-code-bring-customization-and-ci-cd-to-lookml/403537" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Read the technical guide on the Google Developer Community&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;&lt;strong style="vertical-align: baseline;"&gt;Simplify AI search with native AlloyDB hybrid search and Reciprocal Rank Fusion&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;AlloyDB for PostgreSQL simplifies hybrid search architectures by combining vector similarity search and keyword BM25 retrieval within a unified database engine. Using Reciprocal Rank Fusion (RRF), developers can merge lexical scoring and semantic embeddings into a single ranked result without writing a complex SQL query. This unified approach removes the operational overhead of running and synchronizing external search engines alongside operational databases for retrieval-augmented generation (RAG) and search applications.&lt;/span&gt; &lt;a href="https://cloud.google.com/blog/products/databases/simplify-ai-search-with-alloydb-hybrid-search-and-rrf"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Explore hybrid search in AlloyDB&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;October 5 - October 9&lt;/h3&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Data Agent Kit is now generally available to bring Google Data Cloud to any coding agent&lt;br/&gt;&lt;/strong&gt;&lt;a href="https://cloud.google.com/products/data-agent-kit"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Data Agent Kit&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; provides a free collection of Model Context Protocol (MCP) tools and Google-authored agent skills that connect more than 15 Google Data Cloud services directly to coding agents across VS Code, Antigravity, Cursor, Claude Code, and Codex. This release expands support for developers and data practitioners to inspect schemas, author queries, and build end-to-end data pipelines in natural language directly from their IDE or CLI. &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/topics/developers-practitioners/data-agent-kit-is-now-ga-bring-google-data-cloud-to-any-coding-agent"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Read the announcement blog&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Spanner Omni is now generally available for deploy-anywhere, multi-model workloads&lt;br/&gt;&lt;/strong&gt;&lt;strong style="vertical-align: baseline;"&gt;Spanner Omni&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; brings Spanner's distributed SQL, graph, vector, and key-value capabilities to any environment, including on-premises data centers, other public clouds via Kubernetes or VMs, and local developer laptops. Organizations can build and run multi-model applications with consistent APIs and query engines across hybrid and multi-cloud footprints while seamlessly scaling to managed Spanner on Google Cloud. &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/databases/spanner-omni-deploy-anywhere-version-of-spanner-is-now-ga"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Read the launch blog&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and explore how Spanner also &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/databases/spanner-removes-dml-mutation-limits"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;removed cumulative mutation limits for DML transactions&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;AlloyDB delivers PostgreSQL for agents and native BM25 hybrid search&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;We announced &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/databases/announcing-postgresql-for-agents-in-alloydb"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;PostgreSQL for agents in AlloyDB&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, introducing an &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/databases/alloydbs-agentic-database-architecture"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;agentic database architecture&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; engineered for real-time data access at agent scale with workload isolation. In addition, &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/databases/native-bm25-search-in-alloydb-and-cloud-sql"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;native BM25 ranking is now in Preview for AlloyDB and Cloud SQL&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, allowing developers to combine keyword search and vector embeddings directly in PostgreSQL without maintaining an external search engine. For hybrid deployments, the &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/databases/alloydb-omni-rpm-orchestrator-is-generally-available"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;AlloyDB Omni RPM Orchestrator is now generally available&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, and you can dive deeper in our new &lt;/span&gt;&lt;a href="https://cloud.google.com/resources/content/alloydb-for-postgresql"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Build AI apps and agents with AlloyDB eBook&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Lakehouse runtime catalog adds regional endpoints across 22 regions and GA support for flexible column names&lt;br/&gt;&lt;/strong&gt;&lt;a href="https://docs.cloud.google.com/lakehouse/docs/regional-endpoints"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Lakehouse runtime catalog regional endpoints&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; are now live across 22 Google Cloud regions across the Americas, Europe, Asia-Pacific, and the Middle East, supporting both the &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/lakehouse/docs/about-iceberg-rest-catalog-endpoint"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Apache Iceberg REST catalog endpoint&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and the &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/lakehouse/docs/about-spark-hive-metastore"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Apache Hive catalog endpoint&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to help customers meet strict data residency and sovereignty requirements. In addition, &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/schemas#flexible-column-names"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;flexible column names for Apache Iceberg tables&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; are now generally available by default across Iceberg external tables and managed tables, enabling seamless querying of columns containing spaces, hyphens, and Unicode characters. We also announced the Preview of &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/borderless-lakehouse-cross-cloud-caching-and-connections"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;cross-cloud caching and connections for the borderless Lakehouse&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Unlock predictive and agent-ready insights with BigQuery augmented analytics TVFs, TabFM, and identity columns&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;BigQuery introduced &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/bigquery-augmented-analytics-tvfs"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;augmented analytics table-valued functions (TVFs)&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;: six built-in functions that automate metric diagnostics, trend analysis, and pattern discovery directly where your data lives and integrate as skills for AI agents. We also introduced &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/tabfm-adds-predictive-ml-to-bigquery"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;TabFM in BigQuery&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to bring tabular foundation model capabilities to predictive analytics, alongside &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/bigquery-identity-columns-to-auto-generate-sequential-integers"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;BigQuery identity columns&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to automatically generate sequential surrogate keys and simplify data warehouse pipelines.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Dataflow adds Pause/Resume and NVIDIA RTX PRO 6000 Blackwell GPU support for large-scale AI workloads&lt;br/&gt;&lt;/strong&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/new-dataflow-features-to-enable-large-scale-ai-workloads"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;New Dataflow capabilities&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; make it easier to run high-throughput streaming and batch AI pipelines at scale, including Pause/Resume job controls and support for NVIDIA RTX PRO 6000 Blackwell GPUs. And for teams running Apache Spark workloads, learn how to &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/maximize-apache-spark-availability-with-flexible-vms"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;mitigate compute stockouts and maximize availability using flexible VMs&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Unlock up to 3x higher QPS and microsecond latency with Memorystore for Valkey 9.1&lt;br/&gt;&lt;/strong&gt;&lt;a href="https://cloud.google.com/blog/products/databases/memorystore-for-valkey-9-1-3x-qps-caching"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Memorystore for Valkey 9.1&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; is now available, delivering up to 3x higher queries per second (QPS) and microsecond-level caching latencies to accelerate high-throughput applications and real-time AI agent state management. &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/databases/memorystore-for-valkey-9-1-3x-qps-caching"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Read the blog&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Customer momentum across Google Data Cloud — Yahoo, PayPal, Surescripts, Airwallex, and Lucius AI&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Organizations across industries are scaling their data and AI foundations on Google Data Cloud. &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/how-yahoo-optimizes-apache-spark-with-flexible-vms"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Yahoo&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; uses flexible VMs in Managed Service for Apache Spark to reduce provisioning failures by 85%, while &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/paypals-journey-with-managed-service-for-apache-spark"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;PayPal&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; migrated mission-critical analytics workloads to Managed Service for Apache Spark to scale and reduce operational overhead. On the database front, &lt;/span&gt;&lt;a href="https://cloud.google.com/customers/surescripts"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Surescripts&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; migrated 30.5 billion annual healthcare transactions to AlloyDB with 99.998% uptime, &lt;/span&gt;&lt;a href="https://cloud.google.com/customers/airwallex-cloudsql"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Airwallex&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; manages more than 5,000 databases with 99.99% availability on Cloud SQL with a team of four DBAs, and &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/databases/solo-founder-runs-a-global-tender-platform-on-alloydb-and-mcp"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Lucius AI&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; runs a 210,000-tender global platform on AlloyDB and MCP with 47x faster ScaNN vector search.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;September 7 - September 10&lt;/h3&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Pub/Sub SMTs can now AI Inference your Gemini Enterprise Agent Platform models!&lt;br/&gt;&lt;/strong&gt;&lt;a href="https://docs.cloud.google.com/pubsub/docs/smts/ai-inference-smt" style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Pub/Sub AI Inference SMTs&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt; &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;allow you to apply inference on an incoming stream of events using models hosted in Gemini Enterprise Agent Platform. The model’s prediction is appended to your event, making it available for downstream processing in your data warehouse (like BigQuery) or operational database (like BigTable). This feature, now generally available, can dramatically simplify or enhance anomaly detection systems you are operating. &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;PostgreSQL Source Connector is now generally available in Managed Service for Apache Kafka!&lt;br/&gt;&lt;/strong&gt;Managed Service for Apache Kafka’s PostgreSQL connector allows customers to capture changes from their PostgreSQL database and ingest them into their Kafka infrastructure with low latency. This source connector is compatible with &lt;a href="https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/connect-cluster/create-cloud-sql-postgres-source-connector" style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Cloud SQL for Postgres&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/connect-cluster/create-generic-postgres-source-connector" style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;AlloyDB, and self-managed PostgreSQL&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; databases. Try this along with our entire portfolio of &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/kafka-connect-overview" style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;managed connectors, including MirrorMaker 2.0, BigQuery, Cloud Storage, and Pub/Sub&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;! E-mail &lt;/span&gt;&lt;a href="mailto:kafka-hotline@google.com" style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;kafka-hotline@google.com&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; if you have questions or feedback!&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Pause-on-failure for Dataflow batch jobs is GA&lt;br/&gt;&lt;/strong&gt;&lt;a href="https://docs.cloud.google.com/dataflow/docs/guides/pause-job" style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Dataflow pause-on-failure&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; enables you to preserve the state of a batch Dataflow job before it fails. By pausing your Dataflow job, you can address issues that are external to the pipeline and resume processing without losing completed work. This helps you better manage resource costs and improve job reliability when you face temporary outages or capacity constraints.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;The &lt;/strong&gt;&lt;strong style="vertical-align: baseline;"&gt;insertAll&lt;/strong&gt;&lt;strong style="vertical-align: baseline;"&gt; API is now the BigQuery Storage Write API (REST)&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;The legacy insertAll streaming API is now rebranded as the BigQuery Storage Write API (REST). By dropping the "legacy" label, developers can confidently build long-term HTTP-based streaming workflows. This stateless JSON-over-HTTPS endpoint offers a lightweight alternative to heavy gRPC libraries—ideal for serverless web apps, IoT telemetry, and AI logging. The transition is seamless for existing users, requiring zero code changes and offering 100% backward compatibility. However, the &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/write-api-grpc" style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Storage Write API (gRPC)&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; version remains the recommended standard for high-throughput, continuous pipelines.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;August 31 - September 4&lt;/h3&gt;
&lt;ul&gt;
&lt;li role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Stateful processing is available in BigQuery continuous queries in Preview&lt;/strong&gt;&lt;br/&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/continuous-queries-introduction#supported_stateful_operations"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Stateful operations&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; significantly expand what’s possible with BigQuery continuous queries. This feature allows users to leverage functions like &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;JOIN&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;s, aggregations, and windowing functions directly in their streaming queries. Now you can calculate metrics over time (for example, a 30-minute average) to power your downstream applications and AI agents with much richer, real-time signals.&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;Try out our feature &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/continuous-query-joins"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and share your feedback with bq-continuous-queries-feedback@google.com!&lt;/span&gt;&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Synthetic data generator tool is available for Managed Service for Kafka&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;You’ve launched your first Kafka cluster. Now what? The next thing to do is to produce some data to the cluster, but that involves modifying a client application somewhere or spinning up a virtual machine. The synthetic data generator tool, now generally available, can start sending mock data to your cluster in 3 clicks, and will get data streaming into your cluster in less than two minutes. The perfect utility for those moments you just want to test your cluster and new features. Try &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/quickstart-synthetic-data"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;our quickstart&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; today!&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Dataflow pipeline updates are faster &amp;amp; more flexible&lt;br/&gt;&lt;/strong&gt;&lt;a href="https://docs.cloud.google.com/dataflow/docs/guides/upgrade-guide"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Dataflow pipeline updates&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt; &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;can now stop-and-replace pipelines, a major addition to the existing in-place-update feature. The new parallel pipeline option accelerates the migration between the old &amp;amp; new pipeline, resulting in reduced disruption to your business. You can also set a timeout on drains that prevents runaway costs for your pipeliness in the event of stuck processing. This feature is generally available. Try it &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/dataflow/docs/guides/updating-a-pipeline"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;!&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;July 6 - July 10&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;New Lakehouse managed tables now in preview &lt;br/&gt;&lt;/strong&gt;&lt;a href="https://docs.cloud.google.com/lakehouse/docs/manage-tables" style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Lakehouse tables for Apache Iceberg&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; are now in preview and available &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;in the console&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;. By using Google-managed Apache Iceberg tables in Lakehouse, you can eliminate the overhead of maintaining duplicate data pipelines and complex synchronization logic between BigQuery and open-source engine&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;s&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;. This unified table format delivers native, multi-engine read and write interoperability, allowing you to run concurrent DML/DDL operations across diverse analytics tools on a single, shared storage layer.  Built-in automated table management handles painful background optimization tasks like compaction and partition tuning, freeing up your team to focus on building rather than managing storage maintenance.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;June 1 - June 5&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Beyond the Query: Powering AI Agents with Bigtable, Firestore &amp;amp; Memorystore &lt;br/&gt;&lt;/strong&gt;&lt;span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;"&gt;Discover the latest advancements in Google Cloud's NoSQL Database portfolio, including Bigtable, Firestore, and Memorystore. This series is designed for a broad audience: whether you are exploring these databases for the first time or are an existing user looking to leverage the new capabilities announced at Next '26. &lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;a href="https://rsvp.withgoogle.com/events/beyond-the-query-powering-ai-agents-with-bigtable-firestore-memorystore" rel="noopener" style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;" target="_blank"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Register here to secure your spot!&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Cloud Engineer's AI Toolkit Workshops: &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Solve data-driven challenges with &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;BigQuery, AlloyDB&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Gemini&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; and more. &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;Hosted by Google Cloud Labs, this highly technical event is built specifically for Platform Engineers, SREs, and cloud infrastructure teams ready to bridge the gap between AI prototypes and production-grade deployments. Look out for more locations coming soon&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Toronto&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; - June 25 (Data Cloud) | &lt;/span&gt;&lt;a href="https://rsvp.withgoogle.com/events/google-cloud-labs-data-cloud-toronto" rel="noopener" style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;RSVP Here&lt;/span&gt;&lt;/a&gt;&lt;br/&gt;&lt;strong style="vertical-align: baseline;"&gt;Chicago&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; - June 30 (Data Cloud) | &lt;/span&gt;&lt;a href="https://rsvp.withgoogle.com/events/google-cloud-labs-data-cloud-chicago" rel="noopener" style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;RSVP Here&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;strong style="vertical-align: baseline;"&gt;Start a 10-day &lt;/strong&gt;&lt;a href="https://cloud.google.com/bigtable"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Bigtable&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt; free trial with a 1 node SSD cluster and up to 500GB of storage capacity. &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;W&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;ith no credit card required to start, you can easily ingest workloads and manage workloads that require low-latency, high-throughput, and predictable access. &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;Plus, new Google Cloud customers get &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/sql/docs/mysql/create-free-trial-instance"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;$300 in free credits&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; on signup.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;May 11 - May 15&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;strong style="vertical-align: baseline;"&gt;Managed Service for Apache Airflow&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; has launched a wave of new features, including the general availability of Airflow 3.1, AI-powered agentic troubleshooting, a new managed Airflow MCP Server for custom agent integration, and declarative YAML-based orchestration pipelines—discover all the details in the&lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/managed-apache-airflow-scaling-data-and-ai-workloads"&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;full blog post&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;April 20 - April 24&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;strong style="vertical-align: baseline;"&gt;Google-built ODBC Driver for BigQuery is now available in Preview&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;We are excited to announce the launch of the new, Google-built ODBC driver for BigQuery. This new open-source driver provides a direct, high-performance connection for applications to BigQuery and is developed entirely in-house by Google. &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/odbc-for-bigquery"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Download a new driver and connect your application to BigQuery&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;April 13 - April 17&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;We announced &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/looker-studio-is-data-studio"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;we are reintroducing Data Studio&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to play a significant role in the AI era, expanding from data visualizations and reports to host BigQuery conversational agents and data apps built in Colab notebooks.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;We announced &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/introducing-bigquery-graph"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;BigQuery Graph is now available in preview&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, offering an easy-to-use, highly scalable graph analytics solution, empowering data professionals to model, analyze and visualize massive-scale relationships in an entirely new way. &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;April 6 - April 10&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;We introduced &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/business-intelligence/looker-embedded-adds-conversational-analytics"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Conversational Analytics for Looker Embedded environments&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, enabling users to add natural language experiences to their own custom data-driven applications, powered by Gemini. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="vertical-align: baseline;"&gt;We expanded Looker’s capabilities for faster ad-hoc analysis, with the &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/business-intelligence/looker-self-service-explores"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;introduction of self-service Explores&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, enabling you to bring your own data to Looker’s semantic layer and gain instant access to insights in a governed data environment.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;March 23 - March 27&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;We showed you how you can &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/databases/cloudsql-read-pools-support-autoscaling"&gt;&lt;span style="vertical-align: baseline;"&gt;scale your reads with Cloud SQL autoscaling read pools.&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; This feature allows you to provision multiple read replicas that are accessible via a single read endpoint and to dynamically adjust your read capability based on real-time application needs. &lt;/span&gt;&lt;/li&gt;
&lt;li role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;Our customers are leveraging the full power of Conversational Analytics and Looker to drive major business and technical breakthroughs in the AI era. Companies like &lt;/span&gt;&lt;a href="https://cloud.google.com/customers/telenor-looker"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Telenor&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://cloud.google.com/customers/petcircle-looker"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Pet Circle&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://cloud.google.com/customers/fluent-commerce"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Fluent Commerce&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://cloud.google.com/customers/lighthouse"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Lighthouse Intelligence&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://cloud.google.com/customers/wego"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Wego&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, and &lt;/span&gt;&lt;a href="https://cloud.google.com/customers/roller"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;ROLLER&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; are turning data into insights and actions, grounded by Looker’s semantic layer.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;March 16 - March 20&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;We introduced &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/gemini-supercharges-the-bigquery-studio-assistant"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;an enhanced Gemini assistant in BigQuery Studio&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, transforming the agent from a code assistant into a fully context-aware analytics partner.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;February 23 - February 27&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;We introduced &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/databases/managed-mcp-servers-for-google-cloud-databases"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;managed and remote MCP support for Google Cloud databases&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, including AlloyDB, Spanner, Cloud SQL, Bigtable and Firestore, to power the next generation of agents. This announcement extends the ability for AI models to plan, build, and solve complex problems, connecting to the database tools our customers leverage daily as the backbone of their work environment.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;We outlined how you can &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/build-data-agents-with-conversational-analytics-api"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;build a conversational agent in BigQuery using the Conversational Analytics API&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to help you build context-aware agents that can understand natural language, query your BigQuery data, and deliver answers in text, tables, and visual charts.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;February 16 - February 20&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;Our customers are leveraging the full power of Looker to drive major business and technical breakthroughs. Companies like &lt;/span&gt;&lt;a href="https://cloud.google.com/customers/arrive"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Arrive&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://cloud.google.com/customers/audika"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Audika&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://cloud.google.com/customers/looker-carousell"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Carousell&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://cloud.google.com/customers/framebridge"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Framebridge&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://cloud.google.com/customers/gumgum"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;GumGum&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://cloud.google.com/customers/intel-looker"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Intel&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://cloud.google.com/customers/overdose-digital"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Overdose Digital&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://cloud.google.com/customers/one-looker"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Ocean Network Express&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://cloud.google.com/customers/subskribe"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Subskribe&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;a href="https://cloud.google.com/customers/promevo-looker"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Promevo&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; are leveraging Looker’s newest AI-driven capabilities, including Conversational Analytics, to transform data to insights and actions, and empower their entire organization with a single source of truth, powered by Looker’s semantic layer.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;February 2 - February 6&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;Join us on March 4 for our webinar, Win Your AI Strategy with Cloud SQL Enterprise Plus, to learn how to power your generative AI workloads with 3x higher performance and 99.99% availability. &lt;/span&gt;&lt;a href="https://rsvp.withgoogle.com/events/win-your-ai-strategy-with-cloud-sql-enterprise-plus" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Register today&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to discover how to build a scalable, enterprise-grade foundation for your most demanding AI applications.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;January 26 - January 30&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;We introduced &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/introducing-conversational-analytics-in-bigquery"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Conversational Analytics in BigQuery&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;, which allows users to analyze data using natural language.&lt;/span&gt;&lt;/a&gt; &lt;span style="vertical-align: baseline;"&gt;Conversational Analytics in BigQuery is an intelligent agent that generates, executes and visualizes answers grounded in your business context directly in BigQuery Studio, making data insights for data professionals more conversational.&lt;/span&gt;&lt;/li&gt;
&lt;li role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;We outlined how &lt;/span&gt;&lt;a href="https://cloud.google.com/transform/from-asset-to-action-how-data-products-have-become-the-foundation-for-ai-agents"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;data products have become the foundation for AI agents&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, providing the context needed to make autonomous agents reliable and trusted for real business use, backed by organized business logic and semantic understanding.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;We highlighted how &lt;/span&gt;&lt;a href="https://cloud.google.com/use-cases/data-analytics-agents"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;you can supercharge data analytics workflows&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, and outlined Google Cloud’s AI agent offerings for data engineering, data science, and development tools, so you can integrate agentic workflows in your applications, empower your teams and speed discovery.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;January 19 - January 23&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;We have fundamentally reimagined &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/new-firestore-query-engine-enables-pipelines"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Firestore with pipeline operations for Enterprise edition&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt;.&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Experience a powerful new engine featuring over a hundred new query features, index-less queries, new index types, and observability tooling to improve query performance. Seamlessly migrate using built-in tools and leverage Firestore’s existing differentiated serverless foundation, virtually unlimited scale, and industry-leading SLA. Join a community of 600K developers to craft expressive applications that maximize the benefits of rich queryability, real-time listen queries, robust offline caching, and cutting-edge AI-assistive coding integrations.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://www.mssqltips.com/sqlservertip/11578/introducing-google-cloud-sql/" rel="noopener" target="_blank"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Introducing Google Cloud SQL on MSSQLTips&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt;:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; We are highlighting a new technical guide published on MSSQLTips titled "Introducing Google Cloud SQL." This article serves as an essential resource for SQL Server administrators and developers exploring Google Cloud's fully managed database service. It provides a detailed overview of Cloud SQL capabilities, including high availability, security integration, and the seamless transition of on-premises SQL Server workloads to the cloud, making it an ideal resource for those planning their migration strategy.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;We are excited to announce the &lt;/span&gt;&lt;strong&gt;&lt;a href="https://medium.com/google-cloud/bridging-the-identity-gap-microsoft-entra-id-integration-with-cloud-sql-for-sql-server-a30207d63035" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Public Preview of Microsoft Entra ID&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; (formerly Azure Active Directory) integration with Cloud SQL for SQL Server. Designed to tackle the challenge of identity sprawl in multi-cloud environments, this integration allows organizations to govern database access using their existing Microsoft identity infrastructure. Key benefits include centralized identity management, enhanced security features like Multi-Factor Authentication (MFA), and simplified user administration through direct group mapping. This feature is available for SQL Server 2022 and supports both public and private IP configurations.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;January 12 - January 16&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Google-built JDBC Driver for BigQuery is now available in Preview&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;We are excited to announce the launch of the new, Google-built JDBC driver for BigQuery. This new open-source driver provides a direct, high-performance connection for Java applications to BigQuery and is developed entirely in-house by Google. &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/jdbc-for-bigquery"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Download a new driver and connect your Java application to BigQuery&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong style="vertical-align: baseline;"&gt;Troubleshoot Airflow tasks instantly with Gemini Cloud Assist investigations:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Cloud Composer just got smarter. We are excited to announce that &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Gemini Cloud Assist investigations &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;are now available directly within&lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt; Cloud Composer 3&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;. Instead of manually sifting through raw logs, you can now simply click "Investigate" on a failed Airflow task. Gemini analyzes logs and task metadata to identify failure patterns—such as resource exhaustion or timeouts—and provides actionable recommendations driven by Gemini Cloud Assist to resolve the issue. This integration shifts the debugging experience from manual toil to automated root cause analysis, significantly reducing the time required to restore your pipelines.&lt;/span&gt; &lt;a href="https://docs.cloud.google.com/composer/docs/composer-3/troubleshooting-dags#investigations"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Learn more about AI-assisted troubleshooting&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;div class="block-related_article_tout"&gt;





&lt;div class="uni-related-article-tout h-c-page"&gt;
  &lt;section class="h-c-grid"&gt;
    &lt;a href="https://cloud.google.com/blog/products/data-analytics/whats-new-with-google-data-cloud-2025/"
       data-analytics='{
                       "event": "page interaction",
                       "category": "article lead",
                       "action": "related article - inline",
                       "label": "article: {slug}"
                     }'
       class="uni-related-article-tout__wrapper h-c-grid__col h-c-grid__col--8 h-c-grid__col-m--6 h-c-grid__col-l--6
        h-c-grid__col--offset-2 h-c-grid__col-m--offset-3 h-c-grid__col-l--offset-3 uni-click-tracker"&gt;
      &lt;div class="uni-related-article-tout__inner-wrapper"&gt;
        &lt;p class="uni-related-article-tout__eyebrow h-c-eyebrow"&gt;Related Article&lt;/p&gt;

        &lt;div class="uni-related-article-tout__content-wrapper"&gt;
          &lt;div class="uni-related-article-tout__image-wrapper"&gt;
            &lt;div class="uni-related-article-tout__image" style="background-image: url('https://storage.googleapis.com/gweb-cloudblog-publish/images/whats_new_data_cloud_fWg4bKK.max-500x500.png')"&gt;&lt;/div&gt;
          &lt;/div&gt;
          &lt;div class="uni-related-article-tout__content"&gt;
            &lt;h4 class="uni-related-article-tout__header h-has-bottom-margin"&gt;What’s new with Google Data Cloud - 2025&lt;/h4&gt;
            &lt;p class="uni-related-article-tout__body"&gt;Recent product news and updates from our data analytics, database and business intelligence teams.&lt;/p&gt;
            &lt;div class="cta module-cta h-c-copy  uni-related-article-tout__cta muted"&gt;
              &lt;span class="nowrap"&gt;Read Article
                &lt;svg class="icon h-c-icon" role="presentation"&gt;
                  &lt;use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#mi-arrow-forward"&gt;&lt;/use&gt;
                &lt;/svg&gt;
              &lt;/span&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/section&gt;
&lt;/div&gt;

&lt;/div&gt;</description><pubDate>Thu, 29 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/data-analytics/whats-new-with-google-data-cloud/</guid><category>Databases</category><category>Business Intelligence</category><category>Data Analytics</category><media:content height="540" url="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/whats_new_data_cloud_fWg4bKK.png" width="540"></media:content><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>What’s new with Google Data Cloud</title><description></description><image>https://storage.googleapis.com/gweb-cloudblog-publish/original_images/whats_new_data_cloud_fWg4bKK.png</image><site_name>Google</site_name><url>https://cloud.google.com/blog/products/data-analytics/whats-new-with-google-data-cloud/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>The Google Cloud Data Analytics, BI, and Database teams </name><title></title><department></department><company></company></author></item><item><title>Securely connecting Gemini Enterprise to Snowflake data</title><link>https://cloud.google.com/blog/products/data-analytics/bridge-gemini-enterprise-and-snowflake-with-google-adk/</link><description>&lt;div class="block-paragraph"&gt;&lt;p data-block-key="e0239"&gt;Enterprise AI needs to go beyond simple chat interfaces. To provide real value, AI agents must access your data warehouses to generate actionable insights, all while maintaining strict security and data governance.&lt;/p&gt;&lt;p data-block-key="6ntai"&gt;This guide explores how to build a secure bridge between Google Cloud’s Gemini Enterprise and Snowflake. By using the Model Context Protocol (MCP) and the Google Agent Development Kit (ADK), you can empower your agent to act as an assistant that understands natural language, generates precise SQL via Snowflake Cortex and executes queries with user-level permissions.&lt;/p&gt;&lt;h3 data-block-key="8nmi"&gt;&lt;b&gt;Choosing the right integration pattern&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="audah"&gt;&lt;b&gt;Direct Connection vs. custom orchestration&lt;/b&gt;&lt;/p&gt;&lt;p data-block-key="5jmf2"&gt;The Google ADK architecture demonstrated in this post represents the advanced / custom orchestration pattern. It is designed for developers building complex, multi-agent systems on Google Cloud, such as workflows that combine Snowflake insights with external enterprise tools, custom reasoning loops, or cross-platform state management in Gemini Agent Engine.&lt;/p&gt;&lt;p data-block-key="9ug3m"&gt;For standard enterprise basic use cases where you want to connect Gemini Enterprise directly to Snowflake use the joint solutions mentioned in &lt;a href="https://www.snowflake.com/en/developers/guides/quickstart-iceberg-cortex-gemini/" target="_blank"&gt;this link&lt;/a&gt;.&lt;/p&gt;&lt;h3 data-block-key="9ak3f"&gt;&lt;b&gt;The architectural approach&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="6r7f7"&gt;This architecture allows a business user to ask questions like, &lt;i&gt;"What were our top 5 selling items in Texas last quarter?"&lt;/i&gt;&lt;/p&gt;&lt;p data-block-key="epvgc"&gt;Rather than exposing raw SQL execution to the client, the agent delegates both query generation and execution to a governed Snowflake Cortex Agent exposed through the Snowflake MCP server:&lt;/p&gt;&lt;ol&gt;&lt;li data-block-key="a8el9"&gt;&lt;b&gt;Governed translation&lt;/b&gt;: The ADK agent passes the user's natural language question to the Snowflake MCP server, which invokes the Cortex Agent (CORTEX_AGENT_RUN) backed by Cortex Analyst semantic view.&lt;/li&gt;&lt;li data-block-key="2el"&gt;&lt;b&gt;Direct execution within the governed boundary&lt;/b&gt;: The Cortex Agent translates the question into SQL and executes it directly inside Snowflake using the authenticated user's OAuth session and role privileges, returning the structured results to the ADK agent.&lt;/li&gt;&lt;/ol&gt;&lt;p data-block-key="7ga6i"&gt;This approach provides deterministic text-to-SQL translation mapped to your corporate semantic definitions, keeps query execution inside Snowflake's governed boundary, and reduces the risk of schema hallucinations or unvalidated SQL execution.&lt;/p&gt;&lt;h3 data-block-key="a8mnj"&gt;&lt;b&gt;System architecture flow&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="7kjuf"&gt;The diagram below illustrates the trust boundaries and the numbered flow of execution between the Gemini Enterprise app and Snowflake ecosystems.&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/image1_rLGaLNc.max-1000x1000.png"
        
          alt="image1"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;h3 data-block-key="uxtpa"&gt;&lt;b&gt;Detailed execution sequence&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="9pc4t"&gt;To highlight how the agent delegates natural language query translation and governed execution to the Snowflake Cortex Agent over MCP, see the sequence diagram below:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/image2_l1dz0na.max-1000x1000.png"
        
          alt="image2"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;h3 data-block-key="t3stg"&gt;&lt;b&gt;Step 1: Setting up the Snowflake security integration&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="4inv7"&gt;A major risk in enterprise AI is granting the model broad access via a generic service account, which could allow users to bypass security restrictions. We solve this by using OAuth 2.0 to perform user impersonation.&lt;/p&gt;&lt;p data-block-key="8jtt6"&gt;First, establish a confidential OAuth client in Snowflake to protect the client secret. The snippet below configures the security integration inside Snowflake:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;USE ROLE ACCOUNTADMIN;  \r\nCREATE OR REPLACE SECURITY INTEGRATION &amp;lt;SECURITY_INTEGRATION_NAME&amp;gt; \r\nTYPE = OAUTH \r\nENABLED = TRUE \r\nOAUTH_CLIENT = CUSTOM \r\nOAUTH_CLIENT_TYPE = &amp;#x27;CONFIDENTIAL&amp;#x27; \r\n-- Google Cloud&amp;#x27;s official handshake receiver address: \r\nOAUTH_REDIRECT_URI = &amp;#x27;https://vertexaisearch.cloud.google.com/oauth-redirect&amp;#x27; \r\nOAUTH_ISSUE_REFRESH_TOKENS = TRUE \r\n-- Let the connection stay alive for 90 days (max Snowflake allowed limit) \r\nOAUTH_REFRESH_TOKEN_VALIDITY = 7776000;&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8a81dbe90&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="eus6s"&gt;To retrieve the generated client credentials needed for the Google Cloud configuration, run the following command in Snowflake:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;-- Retrieve OAuth Client ID and Client Secret\r\nSELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS(&amp;#x27;&amp;lt;SECURITY_INTEGRATION_NAME&amp;gt;&amp;#x27;);&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb897ae4410&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;h3 data-block-key="eus6s"&gt;&lt;b&gt;Step 2: Data governance and access control&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="oq1f"&gt;Apply the principle of least privilege by creating a dedicated role for your agent inside Snowflake.&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;USE ROLE SECURITYADMIN;\r\n-- 1. Create a dedicated role\r\nCREATE ROLE IF NOT EXISTS &amp;lt;GENAI_ROLE_NAME&amp;gt;;\r\nGRANT ROLE &amp;lt;GENAI_ROLE_NAME&amp;gt; TO USER &amp;lt;BUSINESS_USER_NAME&amp;gt;;  \r\nUSE ROLE SYSADMIN;\r\n-- 2. Grant structural access\r\nGRANT USAGE ON DATABASE &amp;lt;DATABASE_NAME&amp;gt; TO ROLE &amp;lt;GENAI_ROLE_NAME&amp;gt;;\r\nGRANT USAGE ON SCHEMA &amp;lt;DATABASE_NAME&amp;gt;.&amp;lt;SCHEMA_NAME&amp;gt; TO ROLE &amp;lt;GENAI_ROLE_NAME&amp;gt;;\r\n-- 3. Grant compute access\r\nGRANT USAGE ON WAREHOUSE &amp;lt;WAREHOUSE_NAME&amp;gt; TO ROLE &amp;lt;GENAI_ROLE_NAME&amp;gt;;\r\n-- 4 .Grant access to the semantic layer\r\nGRANT SELECT, REFERENCES ON SEMANTIC VIEW &amp;lt;DATABASE_NAME&amp;gt;.&amp;lt;SCHEMA_NAME&amp;gt;.&amp;lt;SEMANTIC_VIEW_NAME&amp;gt; TO ROLE &amp;lt;GENAI_ROLE_NAME&amp;gt;;\r\n-- 5. Grant select privileges on underlying raw data tables\r\nGRANT SELECT ON ALL TABLES IN SCHEMA &amp;lt;DATABASE_NAME&amp;gt;.&amp;lt;SCHEMA_NAME&amp;gt; TO ROLE &amp;lt;GENAI_ROLE_NAME&amp;gt;;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb897ae7fd0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="eus6s"&gt;&lt;b&gt;IMPORTANT&lt;/b&gt;&lt;/p&gt;&lt;ul&gt;&lt;li data-block-key="c6crf"&gt;The user context must have SELECT privileges on the physical tables backing the semantic view. Granting access only to the semantic view will cause runtime errors during query execution.&lt;/li&gt;&lt;li data-block-key="f8lr6"&gt;If granting direct access to base tables is not permitted by your security policy, place a &lt;a href="https://docs.snowflake.com/en/user-guide/views-secure" target="_blank"&gt;&lt;b&gt;Snowflake Secure View&lt;/b&gt;&lt;/a&gt; over the physical tables and build the Semantic View on top of it. Because Snowflake views execute with &lt;b&gt;Owner's Rights&lt;/b&gt;, the user's GenAI role only needs SELECT privileges on the Secure View and Semantic View rather than the raw tables.&lt;/li&gt;&lt;li data-block-key="7dn7r"&gt;&lt;b&gt;Snowflake OAuth tokens&lt;/b&gt; capture and bind to the user's DEFAULT_ROLE and DEFAULT_WAREHOUSE at the exact moment of authorization. If a user authorizes the connection before these defaults are configured, the session will be locked to the wrong role(role available at that time) and query execution will fail if the intended role will not have required privileges.&lt;ul&gt;&lt;li data-block-key="4t073"&gt;&lt;b&gt;Set defaults(as shown below)&lt;/b&gt; prior to authorizing in Gemini Enterprise.&lt;/li&gt;&lt;li data-block-key="931ad"&gt;&lt;b&gt;Authorize connection:&lt;/b&gt; Have the user perform the one-time OAuth authorization in Gemini Enterprise.&lt;/li&gt;&lt;li data-block-key="bl4jf"&gt;&lt;b&gt;(Optional) Revert defaults:&lt;/b&gt; Once authorized, the user can safely revert their default role and warehouse in Snowflake back to their standard operational preferences.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;ALTER USER &amp;lt;BUSINESS_USER_NAME&amp;gt; SET DEFAULT_ROLE = &amp;#x27;&amp;lt;GENAI_ROLE_NAME&amp;gt;&amp;#x27;;\r\nALTER USER &amp;lt;BUSINESS_USER_NAME&amp;gt; SET DEFAULT_WAREHOUSE = &amp;#x27;&amp;lt;WAREHOUSE_NAME&amp;gt;&amp;#x27;;&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb897ae4850&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;h3 data-block-key="eus6s"&gt;&lt;b&gt;Step 3: Provisioning the Cortex Agent and MCP server inside Snowflake&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="75fuf"&gt;Next, create a governed Cortex Agent in Snowflake using your semantic view, then provision an MCP server that exposes the agent via the CORTEX_AGENT_RUN tool type. This approach delegates both SQL generation and query execution to Snowflake while enforcing the caller's OAuth identity and role permissions.&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;USE DATABASE &amp;lt;DATABASE_NAME&amp;gt;;\r\nUSE SCHEMA &amp;lt;SCHEMA_NAME&amp;gt;;\r\nUSE ROLE SYSADMIN;\r\n\r\n-- 1. Create the Cortex Agent over your semantic view\r\nCREATE OR REPLACE AGENT &amp;lt;AGENT_NAME&amp;gt;\r\n  COMMENT = \&amp;#x27;Governed data assistant for business queries\&amp;#x27;\r\n  PROFILE = \&amp;#x27;{&amp;quot;cortex_analyst&amp;quot;: {&amp;quot;semantic_models&amp;quot;: [&amp;quot;&amp;lt;DATABASE_NAME&amp;gt;.&amp;lt;SCHEMA_NAME&amp;gt;.&amp;lt;SEMANTIC_VIEW_NAME&amp;gt;&amp;quot;]}}\&amp;#x27;;\r\n\r\n-- 2. Provision the MCP Server exposing the Cortex Agent\r\nCREATE OR REPLACE MCP SERVER &amp;lt;SERVER_NAME&amp;gt;\r\nFROM SPECIFICATION $$\r\ntools:\r\n  - name: &amp;quot;run_cortex_agent&amp;quot;\r\n    type: &amp;quot;CORTEX_AGENT_RUN&amp;quot;\r\n    identifier: &amp;quot;&amp;lt;DATABASE_NAME&amp;gt;.&amp;lt;SCHEMA_NAME&amp;gt;.&amp;lt;AGENT_NAME&amp;gt;&amp;quot;\r\n    title: &amp;quot;Cortex Agent Assistant&amp;quot;\r\n    description: &amp;quot;Converts natural language questions into SQL and executes them directly within Snowflake using the caller\&amp;#x27;s OAuth session permissions.&amp;quot;\r\n$$;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb897ae7710&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="eus6s"&gt;&lt;b&gt;ISOLATION &amp;amp; GOVERNANCE NOTE:&lt;/b&gt; By using CORTEX_AGENT_RUN, query generation and execution remain fully contained within Snowflake's governed security boundary. Avoid exposing raw execution tools like SYSTEM_EXECUTE_SQL to external clients, as doing so introduces unnecessary security surface area and bypasses centralized Cortex Agent governance.&lt;/p&gt;&lt;h3 data-block-key="7tuaa"&gt;&lt;b&gt;Step 4: Locating and constructing the MCP server URL&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="e87ps"&gt;The ADK code requires the endpoint URL of your Snowflake-managed MCP server. Now that the server is provisioned, you must first grant access to the server, and then you can retrieve its exact endpoint URL using the following query in a Snowflake worksheet:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;-- 1. Grant access to the Cortex Agent and the MCP server\r\nUSE ROLE SECURITYADMIN;\r\nGRANT USAGE ON AGENT &amp;lt;DATABASE_NAME&amp;gt;.&amp;lt;SCHEMA_NAME&amp;gt;.&amp;lt;AGENT_NAME&amp;gt; TO ROLE &amp;lt;GENAI_ROLE_NAME&amp;gt;;\r\nGRANT USAGE ON MCP SERVER &amp;lt;DATABASE_NAME&amp;gt;.&amp;lt;SCHEMA_NAME&amp;gt;.&amp;lt;SERVER_NAME&amp;gt; TO ROLE &amp;lt;GENAI_ROLE_NAME&amp;gt;;\r\n-- 2. View the MCP URL\r\nDESCRIBE MCP SERVER &amp;lt;DATABASE_NAME&amp;gt;.&amp;lt;SCHEMA_NAME&amp;gt;.&amp;lt;SERVER_NAME&amp;gt;;\r\n-- Or:\r\nDESC MCP SERVER &amp;lt;DATABASE_NAME&amp;gt;.&amp;lt;SCHEMA_NAME&amp;gt;.&amp;lt;SERVER_NAME&amp;gt;;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb897ae6f50&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="eus6s"&gt;In the command output, inspect the metadata properties to locate the endpoint link. The URL is structured as follows:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;https://&amp;lt;org_name&amp;gt;-&amp;lt;account_name&amp;gt;.snowflakecomputing.com/api/v2/databases/&amp;lt;database_name&amp;gt;/schemas/&amp;lt;schema_name&amp;gt;/mcp-servers/&amp;lt;server_name&amp;gt;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb897ae4ad0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;h3 data-block-key="eus6s"&gt;&lt;b&gt;Step 5: Connecting via Google ADK&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="ccnb9"&gt;With the MCP Server created and its URL resolved, write your agent code using the Google Agent Development Kit (ADK). In your Python code, define the unique identifier AUTH_ID (e.g. snowflake_oauth_conn) that the agent will use to extract user credentials.&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;import os\r\nimport re\r\nfrom typing import Optional\r\nfrom google.adk.agents.llm_agent import LlmAgent\r\nfrom google.adk.tools.mcp_tool.mcp_toolset import McpToolset\r\nfrom google.adk.tools.mcp_tool.mcp_session_manager import StreamableHTTPConnectionParams\r\nfrom google.adk.tools.tool_context import ToolContext\r\n\r\n# Define the Auth ID first in your code. \r\n# You will use this exact name when registering the agent in the Google Cloud Console.\r\n# Gemini Enterprise maps the authorization token to this identifier in the ToolContext.\r\nAUTH_ID = &amp;quot;snowflake_oauth_conn&amp;quot;  \r\n\r\n# 1. OAuth Header Extraction:\r\n# Define a callback to dynamically extract the user\&amp;#x27;s OAuth token injected by Gemini Enterprise \r\n# and generate the Authorization headers required to authenticate with the Snowflake MCP.\r\ndef get_auth_headers(tool_context: Optional[ToolContext] = None) -&amp;gt; dict: \r\n    &amp;quot;&amp;quot;&amp;quot; \r\n    OAuth Handling Callback: Dynamically extracts the user\&amp;#x27;s OAuth token injected by Gemini Enterprise and generates the headers required to authenticate with the Snowflake MCP. \r\n    &amp;quot;&amp;quot;&amp;quot; \r\n    token = None \r\n    if tool_context and hasattr(tool_context, &amp;quot;state&amp;quot;): \r\n        try: \r\n            # Parse the state dictionary injected by Gemini Enterprise containing authorization states \r\n            state_dict = tool_context.state.to_dict() if hasattr(tool_context.state, \&amp;#x27;to_dict\&amp;#x27;) else tool_context.state \r\n            pattern = re.compile(fr&amp;quot;.*{re.escape(AUTH_ID)}.*&amp;quot;, re.IGNORECASE)  \r\n            # Find the active token matching our Auth ID (snowflake_oauth_conn)\r\n            matching_keys = [k for k in state_dict.keys() if pattern.match(k)] \r\n            if matching_keys: \r\n                token = state_dict.get(matching_keys[0]) \r\n        except Exception as e: \r\n            print(f&amp;quot;Warning: Failed to read ToolContext OAuth state: {e}&amp;quot;)  \r\n    # Return authorization headers. If token is None, requests to MCP will fail.\r\n    return { \r\n        &amp;quot;Authorization&amp;quot;: f&amp;quot;Bearer {token}&amp;quot;, \r\n        &amp;quot;Content-Type&amp;quot;: &amp;quot;application/json&amp;quot;, \r\n        &amp;quot;Accept&amp;quot;: &amp;quot;application/json, text/event-stream&amp;quot;, \r\n    }  \r\n\r\n# 2. MCP Initialization:\r\n# Define the Snowflake MCP URL retrieved from \&amp;#x27;DESCRIBE MCP SERVER\&amp;#x27; directly in the code:\r\nMCP_SERVER_URL = &amp;quot;&amp;lt;YOUR_MCP_SERVER_URL&amp;gt;&amp;quot; # Replace with the URL retrieved from \&amp;#x27;DESCRIBE MCP SERVER\&amp;#x27; \r\n\r\n# Initialize the Snowflake MCP Toolset using this URL.\r\nsnowflake_mcp = McpToolset( \r\n    connection_params=StreamableHTTPConnectionParams( \r\n        url=MCP_SERVER_URL \r\n    ), \r\n    header_provider=get_auth_headers\r\n)  \r\n\r\n# 3. Build the Agent:\r\n# Construct the LlmAgent using the Gemini 2.5 Flash model and attach the Snowflake MCP Toolset.\r\nroot_agent = LlmAgent( \r\n    model=&amp;quot;gemini-2.5-flash&amp;quot;, \r\n    name=&amp;quot;enterprise_data_analyst&amp;quot;, \r\n    instruction=( \r\n        &amp;quot;You are an enterprise data analyst. Use the `enterprise_data_agent` tool &amp;quot; \r\n        &amp;quot;on the Snowflake MCP server to answer business questions. Pass the user\&amp;#x27;s &amp;quot; \r\n        &amp;quot;natural language question to the tool, which translates it into SQL and &amp;quot; \r\n        &amp;quot;executes it directly within Snowflake\&amp;#x27;s governed boundary, then present &amp;quot; \r\n        &amp;quot;the results clearly to the user.&amp;quot; \r\n    ), \r\n    tools=[snowflake_mcp]\r\n)&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb897ae7450&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="eus6s"&gt;&lt;b&gt;NOTE:&lt;/b&gt; The Python snippet above represents a &lt;b&gt;plain/vanilla version&lt;/b&gt; of the agent setup. Depending on your organization's specific requirements, you should add robustness on top of this template (e.g., custom error handling, structured schemas, custom prompts, configurations, and additional tool wrappers).&lt;/p&gt;&lt;h3 data-block-key="2a6ub"&gt;&lt;b&gt;Step 6: Project structure and deployment&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="af8uv"&gt;To deploy your ADK agent to Agent Runtime in Agent Platform, organize your files in the following directory layout:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;snowflake_agent/\r\n├── agent.py # The agent definition and MCP connection code (from Step 5)\r\n├── __init__.py # Package initializer exposing the agent\r\n├── .env # Environment configurations (Google Cloud Project, etc.)\r\n└── requirements.txt # List of project dependencies (google-adk, etc.)&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb897ae6bd0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;ol&gt;&lt;li data-block-key="eus6s"&gt;&lt;b&gt;File details&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li data-block-key="a7lqd"&gt;&lt;b&gt;__init__.py:&lt;/b&gt; Exposes the root_agent object to the deployment CLI:&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;# Snowflake ADK Agent package\r\nfrom .agent import root_agent&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb897ae44d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;ul&gt;&lt;li data-block-key="eus6s"&gt;&lt;b&gt;.env:&lt;/b&gt; Declares environment configuration:&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;GOOGLE_CLOUD_PROJECT=&amp;quot;&amp;lt;YOUR_GCP_PROJECT_ID&amp;gt;&amp;quot;\r\nGOOGLE_CLOUD_LOCATION=&amp;quot;&amp;lt;LOCATION&amp;gt;&amp;quot;\r\nGOOGLE_GENAI_USE_VERTEXAI=&amp;quot;TRUE&amp;quot;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb897ae6f90&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;ul&gt;&lt;li data-block-key="eus6s"&gt;&lt;b&gt;requirements.txt:&lt;/b&gt; Specifies dependencies:&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;google-adk[mcp]==2.3.0\r\ngoogle-genai==2.10.0\r\npydantic-settings==2.14.2\r\ngoogle-cloud-aiplatform[agent_engines]&amp;gt;=1.50.0&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb897ae6810&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="eus6s"&gt;&lt;b&gt;2. Deploying via the CLI&lt;/b&gt;&lt;/p&gt;&lt;p data-block-key="3i800"&gt;Rather than running complex custom Python scripts or manual container builds, you can deploy using the official &lt;b&gt;Google Agents CLI&lt;/b&gt; (agents-cli). The CLI packages your code, sets up the server, and handles the deployment pipeline:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;# Deploy the agent to the Google Cloud Agent Runtime\r\nagents-cli deploy --deployment-target agent_runtime&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb897ae5390&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="eus6s"&gt;The CLI automatically handles the deployment lifecycle. Once complete, it outputs the unique project resource path (e.g., projects/PROJECT_ID/locations/LOCATION/reasoningEngines/RESOURCE_ID) which you will use to register the agent in the next step.&lt;/p&gt;&lt;p data-block-key="4mjr4"&gt;&lt;b&gt;TIP:&lt;/b&gt; For more information and advanced configuration options for ADK agent deployment, refer to:&lt;/p&gt;&lt;ul&gt;&lt;li data-block-key="4e6vh"&gt;&lt;a href="https://adk.dev/deploy/agent-runtime/deploy/" target="_blank"&gt;ADK Agent Runtime Deployment Guide&lt;/a&gt;&lt;/li&gt;&lt;li data-block-key="549ol"&gt;&lt;a href="https://adk.dev/deploy/agent-runtime/index.md" target="_blank"&gt;ADK Deployment Reference Documentation&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 data-block-key="fd69l"&gt;&lt;b&gt;Step 7: Registering the custom agent in Gemini Enterprise&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="71huf"&gt;Once the agent code is ready and deployed, register the agent in the Google Cloud Console. Here, you will link the agent configuration and map the OAuth parameters retrieved from your Snowflake Security Integration.&lt;/p&gt;&lt;ol&gt;&lt;li data-block-key="7sm9l"&gt;&lt;b&gt;Extracting the OAuth Endpoints from Snowflake&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p data-block-key="6971a"&gt;Run this query in Snowflake to extract the precise Token and Authorization endpoints:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;DESCRIBE SECURITY INTEGRATION &amp;lt;SECURITY_INTEGRATION_NAME&amp;gt;;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb897ae5f10&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="eus6s"&gt;In the results, locate the values for the following properties:&lt;/p&gt;&lt;ul&gt;&lt;li data-block-key="48sas"&gt;&lt;b&gt;OAUTH_AUTHORIZATION_ENDPOINT&lt;/b&gt;: Your Snowflake Authorization URI.&lt;/li&gt;&lt;li data-block-key="4gs0e"&gt;&lt;b&gt;OAUTH_TOKEN_ENDPOINT&lt;/b&gt;: Your Snowflake Token URI.&lt;/li&gt;&lt;/ul&gt;&lt;p data-block-key="1a5oh"&gt;&lt;b&gt;2. Registration steps in Google Cloud console&lt;/b&gt;&lt;/p&gt;&lt;ol&gt;&lt;li data-block-key="etoet"&gt;Go to the &lt;b&gt;Gemini Enterprise&lt;/b&gt; page in the console.&lt;/li&gt;&lt;li data-block-key="8jg9"&gt;Select the application you want to register the agent with.&lt;/li&gt;&lt;li data-block-key="6rrda"&gt;In the left navigation, click &lt;b&gt;Agents&lt;/b&gt;, then click &lt;b&gt;+ Add agent&lt;/b&gt;.&lt;/li&gt;&lt;li data-block-key="ckn7c"&gt;Select &lt;b&gt;Add&lt;/b&gt; for &lt;b&gt;Custom agent via Agent Platform&lt;/b&gt;. The Authorizations setup displays.&lt;/li&gt;&lt;li data-block-key="836uh"&gt;Set up the Snowflake OAuth connection:&lt;ul&gt;&lt;li data-block-key="8b5vf"&gt;Click &lt;b&gt;Add authorization&lt;/b&gt;.&lt;/li&gt;&lt;li data-block-key="5c8rh"&gt;&lt;b&gt;Authorization name&lt;/b&gt;: Enter the exact ID you defined in your ADK code (e.g., snowflake_oauth_conn). This ensures the credentials map correctly to the code's AUTH_ID.&lt;/li&gt;&lt;li data-block-key="8f85v"&gt;&lt;b&gt;Client ID&lt;/b&gt; &amp;amp; &lt;b&gt;Client secret&lt;/b&gt;: Input the credentials you retrieved from Snowflake using the SYSTEM$SHOW_OAUTH_CLIENT_SECRETS query.&lt;/li&gt;&lt;li data-block-key="9s51k"&gt;&lt;b&gt;Token URI&lt;/b&gt;: Input the exact token endpoint value extracted from DESCRIBE SECURITY INTEGRATION.&lt;/li&gt;&lt;li data-block-key="4oknm"&gt;&lt;b&gt;Authorization URI&lt;/b&gt;: Take the authorization endpoint value extracted from DESCRIBE SECURITY INTEGRATION and append ?response_type=code at the end (along with your client ID and scope query parameters, for example):&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;https://&amp;lt;org_name&amp;gt;-&amp;lt;account_name&amp;gt;.snowflakecomputing.com/oauth/authorize?client_id=YOUR_CLIENT_ID&amp;amp;redirect_uri=https%3A%2F%2Fvertexaisearch.cloud.google.com%2Foauth-redirect&amp;amp;scope=session%3Arole-any&amp;amp;response_type=code&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8a8af0d10&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="eus6s"&gt;&lt;b&gt;IMPORTANT&lt;/b&gt;&lt;br/&gt;Ensure the Authorization URI ends with &amp;amp;response_type=code (or ?response_type=code if there are no other parameters). This parameter is required by Google Cloud to trigger the OAuth 2.0 authorization code flow.&lt;/p&gt;&lt;ul&gt;&lt;li data-block-key="1q40a"&gt;Click &lt;b&gt;Done&lt;/b&gt;, then click &lt;b&gt;Next&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p data-block-key="388as"&gt;6. Configure the agent properties:&lt;/p&gt;&lt;p data-block-key="u0a6"&gt;7. Click &lt;b&gt;Create&lt;/b&gt; to complete registration.&lt;/p&gt;&lt;p data-block-key="eit9o"&gt;&lt;b&gt;Understanding identifier alignment&lt;/b&gt;&lt;/p&gt;&lt;ul&gt;&lt;li data-block-key="fsbtg"&gt;&lt;b&gt;ADK Code AUTH_ID &amp;lt;==&amp;gt; Google Cloud Authorization Name&lt;/b&gt;: The AUTH_ID in your Python script must exactly match the Authorization Name/ID you input during console registration. Because we write code first, we reuse the code-defined identifier during registration.&lt;/li&gt;&lt;li data-block-key="etsn9"&gt;&lt;b&gt;Snowflake Security Integration Name (e.g. &amp;lt;SECURITY_INTEGRATION_NAME&amp;gt;)&lt;/b&gt;: This is purely a Snowflake-side database object name. It does not need to match the Google Cloud Authorization Name or the AUTH_ID in your ADK Python code.&lt;/li&gt;&lt;/ul&gt;&lt;h3 data-block-key="bs68"&gt;&lt;b&gt;Get started&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="3h60m"&gt;By uniting the Gemini model’s reasoning capabilities, ADK's orchestration, and Snowflake's governed data layer, you can safely bring AI to your data. This architecture provides an agentic assistant that respects your security perimeters while delivering business value.&lt;/p&gt;&lt;/div&gt;</description><pubDate>Tue, 27 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/data-analytics/bridge-gemini-enterprise-and-snowflake-with-google-adk/</guid><category>Data Analytics</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Securely connecting Gemini Enterprise to Snowflake data</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/data-analytics/bridge-gemini-enterprise-and-snowflake-with-google-adk/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Pankaj Bajpai</name><title>Cloud Data Engineer</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Abhilash Adavi</name><title>AI Engineer</title><department></department><company></company></author></item><item><title>Unifying enterprise context and semantics: LookML in Knowledge Catalog is now GA</title><link>https://cloud.google.com/blog/products/business-intelligence/lookml-metadata-indexing-in-knowledge-catalog-is-now-ga/</link><description>&lt;div class="block-paragraph"&gt;&lt;p data-block-key="2fiyl"&gt;As enterprises go from experimental AI agent prototypes to using them in production, data teams are realizing that &lt;i&gt;access&lt;/i&gt; to data is not the same as &lt;i&gt;understanding&lt;/i&gt; that data. To help bridge that gap, today, we are announcing the general availability (GA) of LookML semantic language indexing in Knowledge Catalog for &lt;a href="https://cloud.google.com/looker"&gt;Looker Core on Google Cloud&lt;/a&gt;.&lt;/p&gt;&lt;p data-block-key="508gn"&gt;To answer a complex business question accurately, an AI agent needs context — table schemas, data lineage, governance policies, business definitions, etc.. However, context is not a monolith; knowing where data lives is very different from knowing how to calculate metrics with it. In the enterprise, teams often conflate broad organizational context (usually in the form of metadata from structured and unstructured documents) with deterministic business semantics (the exact SQL formulas, join paths, and filtering rules that define metrics like net revenue or churn), assuming that a single data catalog or a business intelligence (BI) tool handling both enterprise-wide asset discovery and precise metric calculation.&lt;/p&gt;&lt;p data-block-key="b3m7n"&gt;In reality, no one tool can carry the entire load for agentic AI, as enterprise agents require both organizational context and deterministic business semantics. In Google Cloud environments, those are provided by Knowledge Catalog and LookML:&lt;/p&gt;&lt;ul&gt;&lt;li data-block-key="85ccb"&gt;&lt;b&gt;Broad enterprise context with Knowledge Catalog:&lt;/b&gt; Agents need a unified context graph that aggregates metadata across structured tables and unstructured documents. Through Knowledge Catalog, agents discover assets, inspect data quality, trace end-to-end lineage, respect column-level privacy tags, and surface corporate policy documents. The context graph tells an agent what data exists, how it is governed, and how it is connected.&lt;/li&gt;&lt;li data-block-key="e07k9"&gt;&lt;b&gt;Deterministic mathematical semantics with LookML:&lt;/b&gt; What a catalog does not author on its own is how the numbers are computed. Describing a table is not the same as defining how tables join or how metrics are calculated. Looker's modeling language, LookML, encodes production-tested semantic logic — multi-grain join protections, conditional filters, and exact KPI formulas — so agents don't guess SQL math at runtime.&lt;/li&gt;&lt;/ul&gt;&lt;p data-block-key="67h5b"&gt;With this native integration, the LookML business logic that powers your trusted BI reporting is automatically indexed into Knowledge Catalog — giving Gemini Enterprise and custom AI agents both enterprise-wide discovery and deterministic BI semantics.&lt;/p&gt;&lt;h3 data-block-key="a20oc"&gt;&lt;b&gt;Why a context graph needs deterministic semantics&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="3onc2"&gt;When an LLM agent connects directly to raw database tables — even when armed with basic table descriptions or a business glossary — it still has to infer mathematical relationships on the fly. Without explicit semantic rules, agents routinely fall into two traps:&lt;/p&gt;&lt;ol&gt;&lt;li data-block-key="b6fqu"&gt;&lt;b&gt;Metric definition drift:&lt;/b&gt; Standard text-to-SQL agents can invent conflicting formulas for foundational KPIs like net revenue or customer acquisition cost, failing to apply domain-specific accounting rules (such as recognizing revenue only when &lt;i&gt;order_status = 'Complete'&lt;/i&gt; or prorating annual contracts across active service days).&lt;/li&gt;&lt;li data-block-key="1ati4"&gt;&lt;b&gt;Naive join fan-outs:&lt;/b&gt; Complex schemas often contain one-to-many (1:N) and zero-to-many (0:N) relationships across invoices, line items, and refunds. Without pre-modeled join relationships and symmetric aggregation rules, agent-generated SQL can multiply rows and inflate financial totals.&lt;/li&gt;&lt;/ol&gt;&lt;p data-block-key="cevd4"&gt;Knowledge Catalog and Looker solve this together, enabling you to model once in LookML and access those semantics everywhere across Google Cloud's AI ecosystem. Knowledge Catalog enforces semantic math when that logic is defined in a semantic modeling tool; LookML provides a mature, production-proven language for defining those exact mathematical relationships.&lt;/p&gt;&lt;h3 data-block-key="81bdl"&gt;&lt;b&gt;What's new: LookML in Knowledge Catalog&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="4bqqb"&gt;Previously, catalog integrations only captured shallow, file-level pointers and basic dashboard inventories. With this release, LookML's deterministic semantics become a first-class layer in the Knowledge Catalog context graph. An agent that finds a metric in the graph now also finds its exact definition, its join path, and its lineage back to source tables — in the same place, under the same governance. Synchronization is always on by default with no action required from end users, and with live sync, any update pushed to production LookML is reflected in Knowledge Catalog in near-real-time so agents operate on the freshest business logic.&lt;/p&gt;&lt;p data-block-key="184t8"&gt;Because this metadata is indexed directly into Knowledge Catalog by default, it is &lt;a href="https://docs.cloud.google.com/gemini/enterprise/docs/connectors/connect-knowledge-catalog#configure-knowledge-catalog"&gt;immediately available to Gemini Enterprise&lt;/a&gt;, without custom agent code or separate catalog data stores. When connected to Knowledge Catalog, Gemini Enterprise uses built-in read-only skills and hybrid search to look up technical schemas, business glossaries, and indexed LookML logic in a single step, passing that rich context directly to your federated BigQuery connector to generate accurate SQL. (For developers building custom agents, the same context bundles are also accessible via the LookupContext API.)&lt;/p&gt;&lt;p data-block-key="52j72"&gt;Knowledge Catalog now captures and links the following entity levels across Looker Core on Google Cloud:&lt;/p&gt;&lt;ul&gt;&lt;li data-block-key="b4f0c"&gt;&lt;b&gt;LookML models (looker-model):&lt;/b&gt; Captures descriptive metadata, database connection routing, include hierarchies, data validation tests (assert), and parent-child EntryLinks mapping models to their associated Explores, Views, and LookML dashboards.&lt;/li&gt;&lt;li data-block-key="8na7q"&gt;&lt;b&gt;LookML Explores (looker-explore):&lt;/b&gt; Indexes full relational join logic (type, sql_on, relationship cardinality such as many_to_one fan-out protection, foreign_key, required_joins, and sql_where) as Schema-Join relationships. It also captures mandatory filter guardrails (always_filter, access_filter), inherited dimensions and measures, and predefined &lt;b&gt;starter queries&lt;/b&gt; that help agents and analysts overcome the cold-start problem.&lt;/li&gt;&lt;li data-block-key="5ii46"&gt;&lt;b&gt;LookML Views and fields (looker-view):&lt;/b&gt; Extracts column-level compiled LookML SQL expressions (for example, ${total_revenue} / NULLIF(${count}, 0)), primary keys, dimension group timeframes, field synonyms, and derived table transformation logic (including SQL and native derived tables, partition keys, and cluster keys).&lt;/li&gt;&lt;li data-block-key="38pu8"&gt;&lt;b&gt;Dashboards, Looks, and tiles (looker-dashboard, looker-dashboard-element, looker-look):&lt;/b&gt; Catalogs both UI-created and LookML-defined dashboards and visualization tiles, complete with dashboard filters, chart types, ownership, and usage statistics. Users in Knowledge Catalog are able to see table- and column-level lineage from underlying BigQuery tables all the way to individual dashboard tiles, allowing data engineers to evaluate schema changes proactively, before disruptions occur.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/1_-_LookML_Indexing_in_Knowledge_Catalog.gif"
        
          alt="1 - LookML Indexing in Knowledge Catalog"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="0hlcw"&gt;Looker Core on Google Cloud automatically indexes resolved LookML models, Explores, Views, lineage, and dashboards directly into Knowledge Catalog.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;h3 data-block-key="7aqpt"&gt;&lt;b&gt;Three patterns for data agents&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="a5a5f"&gt;Bringing LookML into Knowledge Catalog gives Gemini Enterprise (and your broader agent ecosystem) a single place to retrieve both broad organizational context and governance from Knowledge Catalog and explicit mathematical relationships and SQL definitions authored in LookML.&lt;/p&gt;&lt;p data-block-key="17vig"&gt;To see the impact of combining these two layers in Gemini Enterprise, compare how three architectures handle a complex cross-domain prompt: &lt;i&gt;"What was our total revenue last fiscal quarter by product category, and which regional promotional policy limits apply?"&lt;/i&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;&lt;table border="1" style="border-collapse: collapse; width: 100%; height: 1104px;"&gt;
&lt;tbody&gt;
&lt;tr style="height: 86.766px;"&gt;
&lt;td style="width: 15.4264%; height: 86.766px;"&gt;&lt;strong style="vertical-align: baseline;"&gt;Agent architecture&lt;/strong&gt;&lt;/td&gt;
&lt;td style="width: 27.9723%; height: 86.766px;"&gt;&lt;strong style="vertical-align: baseline;"&gt;System mechanics&lt;/strong&gt;&lt;/td&gt;
&lt;td style="width: 27.5817%; height: 86.766px;"&gt;&lt;strong style="vertical-align: baseline;"&gt;Data logic and governance resolution&lt;/strong&gt;&lt;/td&gt;
&lt;td style="width: 28.8889%; height: 86.766px;"&gt;&lt;strong style="vertical-align: baseline;"&gt;User experience and token efficiency&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="height: 316.688px;"&gt;
&lt;td style="width: 15.4264%; height: 316.688px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Pattern 1: Baseline database agent&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Data warehouse only&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="width: 27.9723%; height: 316.688px;"&gt;&lt;span style="vertical-align: baseline;"&gt;Direct LLM writing raw SQL against warehouse tables with no semantic or catalog context.&lt;/span&gt;&lt;/td&gt;
&lt;td style="width: 27.5817%; height: 316.688px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Ungoverned and non-deterministic&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Has no visibility into data quality, PII tags, or corporate documents, and guesses SQL metric logic blindly — assuming a standard January fiscal calendar, summing uncompleted orders, and exposing restricted customer PII.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="width: 28.8889%; height: 316.688px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Fragile and high-risk&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Prone to schema hallucinations, fails on questions requiring unstructured policy context, and burns tokens in multi-turn SQL debugging loops.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="height: 361.469px;"&gt;
&lt;td style="width: 15.4264%; height: 361.469px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Pattern 2: Context-grounded agent&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Knowledge Catalog without indexed semantics&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="width: 27.9723%; height: 361.469px;"&gt;&lt;span style="vertical-align: baseline;"&gt;Gemini Enterprise or another agent platform uses Knowledge Catalog to look up table descriptions, glossary terms, PII governance aspects, and unstructured policy PDFs, then writes SQL via the warehouse connector.&lt;/span&gt;&lt;/td&gt;
&lt;td style="width: 27.5817%; height: 361.469px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Context-grounded, but lacks semantic SQL logic &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Enforces Knowledge Catalog governance and retrieves unstructured promotional policy rules, but lacks semantic definitions for SQL metrics and table relationships. This approach can miss conditional accounting rules (like order_status = 'Complete') or cause join fan-outs across multi-grain tables.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="width: 28.8889%; height: 361.469px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Governed discovery, inconsistent math&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Solves asset discovery, compliance, and unstructured context, but still suffers from text-to-SQL calculation drift and multi-turn SQL retries.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="height: 339.078px;"&gt;
&lt;td style="width: 15.4264%; height: 339.078px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Pattern 3: Context + semantic-grounded agent&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Knowledge Catalog + Looker Core on Google Cloud with indexed LookML&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="width: 27.9723%; height: 339.078px;"&gt;&lt;span style="vertical-align: baseline;"&gt;Gemini Enterprise or another agent platform connects to Knowledge Catalog enriched with indexed LookML metadata, automatically retrieving both broad catalog context and LookML join paths and field formulas to ground its SQL generation.&lt;/span&gt;&lt;/td&gt;
&lt;td style="width: 27.5817%; height: 339.078px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Governed context plus semantic SQL definitions&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Enforces Knowledge Catalog PII aspects, retrieves unstructured policy PDFs, and grounds its SQL in LookML's exact mathematical definitions indexed in Knowledge Catalog, applying status = 'Complete', the May–July fiscal calendar, and predefined join conditions across warehouse tables.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="width: 28.8889%; height: 339.078px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Accurate and token-efficient: &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Pre-mapped LookML join blueprints and compiled SQL expressions replace guessing, prevent join fan-outs, reduce SQL retry loops, and let the agent point users to relevant Looker dashboards and Explores.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="avmti"&gt;When you follow pattern 3 and pair Knowledge Catalog with Looker's semantic layer in an enterprise agent workflow, the agent moves from guessing at raw SQL to a governed, two-stage execution flow:&lt;/p&gt;&lt;ol&gt;&lt;li data-block-key="dke9g"&gt;&lt;b&gt;Context and governance discovery in Knowledge Catalog:&lt;/b&gt; Before touching any data, the agent searches Knowledge Catalog, verifies that the thelook_ecommerce LookML model is gold-certified, checks column-level governance tags, and maps the prompt to exact LookML dimensions and measures, converting natural language into structured business intent.&lt;/li&gt;&lt;li data-block-key="bpcm7"&gt;&lt;b&gt;Deterministic semantic execution:&lt;/b&gt; Rather than having the LLM invent SQL on the fly, the agent grounds its SQL in LookML's exact mathematical definitions indexed in Knowledge Catalog and returns trusted, repeatable figures.&lt;/li&gt;&lt;/ol&gt;&lt;p data-block-key="2195h"&gt;Alongside the answer, the agent returns an interactive &lt;i&gt;Open in Looker Explore&lt;/i&gt; link with the exact measures and filters pre-populated, letting users slice, dice, and inspect row-level line items in a single click.&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/2_-_Updated_Image_with_Side_By_Side.gif"
        
          alt="2 - Updated Image with Side By Side"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="smo6p"&gt;Side-by-side comparison of a baseline agent querying BigQuery directly (left), which guesses at raw SQL and fiscal dates, versus an agent governed by Knowledge Catalog and Looker (right), which applies indexed LookML definitions and returns an interactive "Open in Looker Explore" link.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;h3 data-block-key="demba"&gt;&lt;b&gt;Scaling agents for BI and the enterprise&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="l2lb"&gt;A common question from data leaders is: &lt;i&gt;"If we use Looker Conversational Analytics, when do we use an enterprise agent grounded in Knowledge Catalog?"&lt;/i&gt;&lt;/p&gt;&lt;p data-block-key="9avnm"&gt;The two experiences are designed for complementary jobs across your organization:&lt;/p&gt;&lt;ul&gt;&lt;li data-block-key="2bffc"&gt;&lt;b&gt;Looker Conversational Analytics is your dedicated BI assistant:&lt;/b&gt; When business users are working inside BI workflows and asking questions scoped to a focused set of curated Looker Explores, Conversational Analytics delivers immediate, self-service data exploration and visualization directly within Looker.&lt;/li&gt;&lt;li data-block-key="62nr4"&gt;&lt;b&gt;Knowledge Catalog + Looker powers your enterprise-wide agents:&lt;/b&gt; When users ask questions in Gemini Enterprise across federated Data Cloud sources like BigQuery, they often span structured tables, BI metrics, and unstructured documents. Enabling Knowledge Catalog in Gemini Enterprise gives the assistant built-in skills to dynamically discover relevant semantics across hundreds of LookML models, pass indexed LookML join definitions, metric SQL formulas, and starter queries to the BigQuery connector to prevent join hallucinations, and enforce centralized governance aspects and IAM.&lt;/li&gt;&lt;/ul&gt;&lt;h3 data-block-key="9m3j3"&gt;&lt;b&gt;Getting started&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="34blp"&gt;Because Looker Core on Google Cloud, Knowledge Catalog, and Gemini Enterprise are natively integrated, you can connect your existing LookML business logic to your enterprise AI assistant in just a few clicks, with no custom agent code required.&lt;/p&gt;&lt;p data-block-key="32tq8"&gt;To start discovering Looker semantics and grounding your agents:&lt;/p&gt;&lt;ol&gt;&lt;li data-block-key="ads98"&gt;&lt;b&gt;Confirm first-party metadata indexing is enabled for Looker Core on Google Cloud.&lt;/b&gt; This is enabled by default for new instances, with no additional charge for storing Looker technical metadata. Once enabled, metadata synchronization into Knowledge Catalog is always on by default (across both initial indexing and ongoing live updates). Enable the Cloud Dataplex API and Data Lineage API in your project and grant users the required view roles (roles/dataplex.viewer, roles/looker.schemaViewer, and roles/datalineage.viewer) to have your resolved LookML models, Explores, Views, join paths, and dashboards automatically sync into Knowledge Catalog.&lt;/li&gt;&lt;li data-block-key="3ftci"&gt;&lt;b&gt;Enable Knowledge Catalog in Gemini Enterprise&lt;/b&gt;. When you attach a BigQuery (or Spanner, Cloud SQL, or AlloyDB) data store in federated query mode to your Gemini Enterprise app, the Knowledge Catalog integration is enabled automatically. You can also turn it on or off at any time in the Google Cloud console by opening your Gemini Enterprise app, navigating to Configurations &amp;gt; Assistant, toggling on Enable Knowledge Catalog, and clicking Save and publish.&lt;/li&gt;&lt;li data-block-key="eukd7"&gt;&lt;b&gt;Ask questions&lt;/b&gt;. Gemini Enterprise connects to Knowledge Catalog using end-user credentials, meaning users only discover and query data assets they have IAM permission to view (such as roles/bigquery.dataViewer). Behind the scenes, the assistant automatically looks up your indexed LookML definitions, join logic, and starter queries in Knowledge Catalog and passes them to your federated connector to deliver accurate, governed answers.&lt;/li&gt;&lt;/ol&gt;&lt;p data-block-key="6bao3"&gt;To dive deeper, read the &lt;a href="https://docs.cloud.google.com/knowledge-catalog/docs/manage-looker-core-metadata"&gt;Manage Looker Core on Google Cloud with Knowledge Catalog documentation&lt;/a&gt; and learn how to &lt;a href="https://docs.cloud.google.com/gemini/enterprise/docs/connectors/connect-knowledge-catalog#configure-knowledge-catalog"&gt;Connect to Knowledge Catalog in Gemini Enterprise&lt;/a&gt;. To build a more customized experience, explore our &lt;a href="https://github.com/haengeunc/kc-looker-codelab" target="_blank"&gt;hands-on ADK agent codelab on GitHub&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;</description><pubDate>Mon, 26 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/business-intelligence/lookml-metadata-indexing-in-knowledge-catalog-is-now-ga/</guid><category>Data Analytics</category><category>Business Intelligence</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Unifying enterprise context and semantics: LookML in Knowledge Catalog is now GA</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/business-intelligence/lookml-metadata-indexing-in-knowledge-catalog-is-now-ga/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Maire Newton</name><title>Outbound Product Manager, Google Cloud</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Ramanan Balakrishnan</name><title>Group Outbound Product Manager, Data Cloud</title><department></department><company></company></author></item><item><title>Introducing new self-learning context enrichment in Knowledge Catalog</title><link>https://cloud.google.com/blog/products/data-analytics/knowledge-catalog-self-learning-context-enrichment-for-ai-agents/</link><description>&lt;div class="block-paragraph"&gt;&lt;p data-block-key="esvkk"&gt;Today, we’re launching self-learning context enrichment (preview) and a reimagined Knowledge Studio experience (preview) in &lt;a href="https://docs.cloud.google.com/knowledge-catalog/docs/introduction"&gt;Knowledge Catalog&lt;/a&gt;, Google Cloud’s context engine for agents. Building on Knowledge Catalog's existing Gemini-powered enrichment, self-learning enrichment analyzes agent and user interactions to find gaps and keep your business context accurate and current. &lt;a href="https://docs.cloud.google.com/knowledge-catalog/docs/knowledge-studio"&gt;Knowledge Studio&lt;/a&gt; is the new command center for context engineers and data stewards to explore their data estate conversationally, navigate a visual context graph, and review proposed changes to the context graph before they are published to their users and agents.&lt;/p&gt;&lt;p data-block-key="1cak9"&gt;An agent is only as good as the organization-wide definitions, rules, and relationships it reasons over — the context, as it were. That’s why curating context has become one of the most important disciplines in enterprise agentic capabilities. Today, most of that work happens by hand. Context engineers write prompts and mappings agent by agent, while data stewards try to manually keep definitions current across thousands of assets. But this breaks down as organizations move from a handful of agents to thousands, and eventually millions.&lt;/p&gt;&lt;p data-block-key="b00qv"&gt;Knowledge Catalog’s Gemini-powered self-learning enrichment turns that manual upkeep into a continuous feedback loop. By analyzing agent and user interactions, it pinpoints missing or outdated context and pulls verified definitions from playbooks, code repositories, and business documents into governed, reusable context sets. Then, with optimized search, every agent gets precisely the right context it needs instead of reasoning over bloated prompts and raw schemas, and benefits from shared learning across your organization. Knowledge Catalog makes AI agents nearly 4X more accurate, with up to 33% lower latency, and using up to 75% fewer tokens, based on internal benchmarks.&lt;/p&gt;&lt;h3 data-block-key="f6h0a"&gt;&lt;b&gt;Keep context current with Gemini-powered self-learning enrichment&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="19h9e"&gt;Consider a simple question to a Gemini agent: "What was the net revenue in EMEA last quarter?" Answering it correctly requires knowing how your company defines net revenue, which tables hold the bookings, and how they join, yet that knowledge is typically scattered across a finance playbook in Google Docs, a data model in GitHub, and a Confluence page. Static catalogs expect subject matter experts to manually capture and update business definitions, metrics, and other context upfront so that an agent can effectively query the right data. However, in reality, experts rarely have the time to document every asset, and the moment the finance team revises how partner credits are treated next quarter, static definitions fall behind and every agent with a hardcoded formula starts giving the wrong answer.&lt;/p&gt;&lt;p data-block-key="eol12"&gt;Knowledge Catalog’s enrichment capability acts where you already keep your business knowledge: across your team’s every doc, repo, and table. It connects to your structured data across first-party and third-party sources and unstructured data in Cloud Storage, Google Workspace, GitHub, Confluence, and SharePoint. It finds, extracts, assembles, and maintains that business knowledge for you, linking those unstructured sources like playbooks and wikis and their context to your structured metadata in Knowledge Catalog like tables and schemas to make your structured data far more discoverable and actionable. On demand or on a schedule, it proposes business definitions, table and column descriptions, join relationships, golden queries, and task-specific agent instructions, each with source citations and a confidence score. On every run, it detects what changed at the source, retires obsolete definitions, and flags conflicts for review.&lt;/p&gt;&lt;p data-block-key="f2ei7"&gt;It learns from both your user and agent interactions. You can configure enrichment to analyze interaction traces from Gemini agents, Conversational Analytics in BigQuery, or your custom agents while redacting PII, and it pinpoints where agents struggled, such as ambiguous column lookups, ungrounded metrics, missing definitions, or users rephrasing the same question. It then finds the authoritative answer and stages a fix, so the same mistake doesn't happen twice. That's how context engineering keeps pace with millions of agent interactions, freeing experts to review changes instead of writing them from scratch.&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/1-Configuring_an_enrichment_task_with_connected_sources_evaluation_and_sel.gif"
        
          alt="1-Configuring an enrichment task with connected sources, evaluation, and self-learning"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="vt81w"&gt;Configuring an enrichment task with connected sources, evaluation, and self-learning&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="frshr"&gt;Automation doesn't mean giving up control. You can choose to enable or disable auto-publishing at any time, and set the exact confidence score (for example, 85%) at which proposed changes are automatically approved. Anything below your threshold, along with sensitive updates such as deletions, become a Change Request for a steward to approve, edit, or reject. You can also provide your own evaluation set to test proposed updates end to end. Every change is logged with full provenance and can be reverted. And of course, Google never uses your data to train its models.&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/2-Reviewing_enrichment_proposals_confidence_scores_and_change_diffs_before.gif"
        
          alt="2-Reviewing enrichment proposals, confidence scores, and change diffs before publishing"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="gn3z8"&gt;Reviewing enrichment proposals, confidence scores, and change diffs before publishing&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;h3 data-block-key="frshr"&gt;&lt;b&gt;Set the right context for each audience with context sets&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="4n5of"&gt;By design, an enterprise context graph is quite broad, but for a given task, both agents and users often only need the right, trusted segment of it. Knowledge Catalog achieves that with context sets — curated, governed subsets of the context graph that contains the definitions, metrics, join logic, and golden queries for a specific domain, team, agent, or group of end users. For instance, a sales agent can be bound to the Sales context set, while a finance analyst's assistant can be bound to the Finance context set. Because "net revenue" can legitimately mean different things to each group, every domain maintains its own definitions in the same catalog. However, agents don't have to be bound to a single set; with search in Knowledge Catalog, an agent can also dynamically search and find the right context set for any given task.&lt;/p&gt;&lt;p data-block-key="df370"&gt;Context sets also provide built-in data governance and fine-grained access control. Access to each context set is managed with IAM, so stewards decide which agents and users can read, use, or edit it. Agents only retrieve context from the sets they're authorized to use, and access to the underlying data continues to follow your existing permissions. Every update is traceable, and reversible, and because context sets build on the &lt;a href="https://cloud.google.com/blog/products/data-analytics/how-the-open-knowledge-format-can-improve-data-sharing"&gt;Open Knowledge Format&lt;/a&gt; (OKF), you can import an OKF bundle to become a context set and export it back out as OKF so your context stays portable.&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/3-Approved_enrichments_published_to_a_governed_context_set.gif"
        
          alt="3-Approved enrichments published to a governed context set"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="gn3z8"&gt;Approved enrichments published to a governed context set&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;h3 data-block-key="a0ipa"&gt;&lt;b&gt;Explore and govern it all in Knowledge Studio&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="f3a54"&gt;All of these capabilities come together in the reimagined Knowledge Catalog experience, built for context engineers and data stewards who curate and govern context for agents.&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/4-Navigating_the_context_graph_visually_in_Knowledge_Studio.gif"
        
          alt="4-Navigating the context graph visually in Knowledge Studio"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="jycjf"&gt;Navigating the context graph visually in Knowledge Studio&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="ljr85"&gt;The new Knowledge Studio turns Knowledge Catalog from a repository of static inventory into an interactive command center, allowing you to:&lt;/p&gt;&lt;ul&gt;&lt;li data-block-key="9er9j"&gt;&lt;b&gt;See context coverage at a glance:&lt;/b&gt; Navigate a visual map of your cross-cloud data estate, from operational databases and warehouses to semantic models, context sets, and documentation.&lt;/li&gt;&lt;li data-block-key="9qpaj"&gt;&lt;b&gt;Explore context conversationally:&lt;/b&gt; Ask business questions in natural language, traverse relationships across your enterprise context graph, and see exactly how agents reason over your metadata.&lt;/li&gt;&lt;li data-block-key="enb8d"&gt;&lt;b&gt;Review and validate enrichments in one place:&lt;/b&gt; Inspect each proposed change, source citations, and confidence score. Test context sets against real questions, and approve, edit, or roll back change requests with software-style version control.&lt;/li&gt;&lt;li data-block-key="5i888"&gt;&lt;b&gt;Monitor enrichment runs:&lt;/b&gt; Track each enrichment task's schedule, results, token usage, and run duration, and get notified by email when a run completes.&lt;/li&gt;&lt;/ul&gt;&lt;h3 data-block-key="43hkb"&gt;&lt;b&gt;Get started&lt;/b&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;div class="block-video"&gt;



&lt;div class="article-module article-video "&gt;
  &lt;figure&gt;
    &lt;a class="h-c-video h-c-video--marquee"
      href="https://youtube.com/watch?v=qeWzgLGSkls"
      data-glue-modal-trigger="uni-modal-qeWzgLGSkls-"
      data-glue-modal-disabled-on-mobile="true"&gt;

      
        &lt;img src="//img.youtube.com/vi/qeWzgLGSkls/maxresdefault.jpg"
             alt="How Knowledge Catalog’s self-learning enrichment grounds enterprise AI agents"/&gt;
      
      &lt;svg role="img" class="h-c-video__play h-c-icon h-c-icon--color-white"&gt;
        &lt;use xlink:href="#mi-youtube-icon"&gt;&lt;/use&gt;
      &lt;/svg&gt;
    &lt;/a&gt;

    
      &lt;figcaption class="article-video__caption h-c-page"&gt;
        
          &lt;h4 class="h-c-headline h-c-headline--four h-u-font-weight-medium h-u-mt-std"&gt;Watch the demo: How Knowledge Catalog’s self-learning enrichment grounds agents&lt;/h4&gt;
        
        
      &lt;/figcaption&gt;
    
  &lt;/figure&gt;
&lt;/div&gt;

&lt;div class="h-c-modal--video"
     data-glue-modal="uni-modal-qeWzgLGSkls-"
     data-glue-modal-close-label="Close Dialog"&gt;
   &lt;a class="glue-yt-video"
      data-glue-yt-video-autoplay="true"
      data-glue-yt-video-height="99%"
      data-glue-yt-video-vid="qeWzgLGSkls"
      data-glue-yt-video-width="100%"
      href="https://youtube.com/watch?v=qeWzgLGSkls"
      ng-cloak&gt;
   &lt;/a&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="ftszu"&gt;These features will be rolled out to customers in the next few weeks. &lt;a href="https://docs.google.com/forms/d/1Xsxc1j9XqHupqnvfn7hC1bHtAB90ro4GqkCZboAPW_M/edit" target="_blank"&gt;Sign up&lt;/a&gt; to request immediate access and visit the &lt;a href="https://docs.cloud.google.com/knowledge-catalog/docs"&gt;documentation&lt;/a&gt; for step-by-step guidance.&lt;/p&gt;&lt;/div&gt;</description><pubDate>Thu, 22 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/data-analytics/knowledge-catalog-self-learning-context-enrichment-for-ai-agents/</guid><category>Data Analytics</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Introducing new self-learning context enrichment in Knowledge Catalog</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/data-analytics/knowledge-catalog-self-learning-context-enrichment-for-ai-agents/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Firat Elbey</name><title>Group Product Manager, Data Analytics</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Vasiya Krishnan</name><title>Product Lead</title><department></department><company></company></author></item><item><title>BigQuery ObjectRef now GA: Build multimodal data platforms for conversational analytics entirely in SQL</title><link>https://cloud.google.com/blog/products/data-analytics/analyze-unstructured-data-in-bigquery-with-objectref/</link><description>&lt;div class="block-paragraph"&gt;&lt;p data-block-key="8laja"&gt;For data science, data engineering, and machine learning teams, unlocking the value of unstructured data, such as images, videos, audio, and documents, has historically meant managing siloed data pipelines for structured and unstructured data, and for analytics and AI/ML use cases. Even when files remain in Cloud Storage, running inference requires teams to orchestrate external machine learning workloads, only to face the complex, brittle challenge of stitching those structured inference outputs back into the data warehouse for analysis. This post-hoc data-stitching introduces significant operational overhead and database misalignment.&lt;/p&gt;&lt;p data-block-key="3itfp"&gt;&lt;b&gt;ObjectRef&lt;/b&gt; and multimodal data analytics in BigQuery are now in&lt;b&gt; General Availability (GA)&lt;/b&gt;, establishing BigQuery as a comprehensive, multimodal agentic data platform.&lt;/p&gt;&lt;p data-block-key="3stff"&gt;With ObjectRef, BigQuery natively bridges the gap between Cloud Storage and your analytical engine. You can represent unstructured data as native ObjectRef columns directly alongside your traditional relational columns. This unlocks a massive advantage over standalone model APIs by enabling you to pass &lt;b&gt;multimodal, multi-column inputs&lt;/b&gt; directly to Gemini models in a single SQL query or natural language query using conversational analytics. ObjectRef integrations with BigQuery AI, conversational analytics in BigQuery and Gemini Enterprise enable you to easily combine Cloud Storage files with rich, structured database context, metadata, timestamps and custom agent instructions.&lt;/p&gt;&lt;p data-block-key="6ffb5"&gt;You can now leverage BigQuery's core strengths (fully serverless compute, low total cost of ownership, and built-in at-scale inference) to build, run, and govern powerful unstructured-to-structured, unstructured-to-unstructured and fully multimodal-to-multimodal pipelines without separate compute clusters. Crucially, the extracted features and annotations can be combined directly with the unstructured object itself by storing the ObjectRef in the same row. Using this combined data directly in conversational analytics and AI agents avoids the loss of nuanced data and context that typically occurs when customers transform unstructured files into purely structured formats. Customers are already using this approach to &lt;b&gt;generate embeddings for multimodal vector search&lt;/b&gt;, perform &lt;b&gt;at-scale classification using GenAI&lt;/b&gt;, and execute precise &lt;b&gt;data and feature extraction&lt;/b&gt; from vast archives of documents and media, all via standard SQL.&lt;/p&gt;&lt;p data-block-key="8thnp"&gt;For example, this single query uses AI.AGG to summarize the product images in a public BigQuery sample dataset:&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;SELECT\r\nAI.AGG(image_ref, &amp;quot;Summarize the major categories of pictures&amp;quot;)\r\nFROM\r\n`bigquery-public-data.cymbal_pets.products`;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb896e58bd0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;h3 data-block-key="8laja"&gt;&lt;b&gt;ObjectRef brings structure to the unstructured&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="3upha"&gt;ObjectRef is a built-in, predefined STRUCT data type that points to objects outside of BigQuery.&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;-- ObjectRef is a special STRUCT in BigQuery \r\nSTRUCT&amp;lt;\r\n  uri STRING,\r\n  version STRING,\r\n  authorizer STRING,\r\n  details JSON&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb896e59bd0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="pgq21"&gt;By storing these pointers natively in standard BigQuery tables alongside traditional columns, BigQuery treats unstructured files as first-class data citizens. Furthermore, this architecture supports independent data lifecycles: your GCS data and BigQuery tables can change independently without affecting the underlying data in the other system.&lt;/p&gt;&lt;p data-block-key="26las"&gt;This approach serves multiple data personas by offering powerful advantages:&lt;/p&gt;&lt;ul&gt;&lt;li data-block-key="138be"&gt;&lt;b&gt;Zero-copy architecture:&lt;/b&gt; Keep your high-volume media files securely in Cloud Storage and query them instantly in BigQuery, respecting data gravity and avoiding costly data duplication.&lt;/li&gt;&lt;li data-block-key="cdfgi"&gt;&lt;b&gt;SQL and Python interoperability:&lt;/b&gt; You can query unstructured data using standard SQL or BigQuery DataFrames. Crucially, you can pass ObjectRefs into BigQuery Python UDFs, allowing you to bring open-source Python libraries, like OpenCV, directly to your data to execute custom logic without moving it.&lt;/li&gt;&lt;li data-block-key="6bnoh"&gt;&lt;b&gt;Independent lifecycles and versioning:&lt;/b&gt; ObjectRefs ensure reproducible inference by tracking specific GCS generation numbers. If the underlying GCS file changes, your query can still reference the exact version of the file that existed when the row was written.&lt;/li&gt;&lt;li data-block-key="2vev9"&gt;&lt;b&gt;Unified governance:&lt;/b&gt; You can secure, audit, and share access to both structured columns and their related unstructured files using BigQuery's existing security policies and IAM controls.&lt;/li&gt;&lt;/ul&gt;&lt;h3 data-block-key="7124u"&gt;&lt;b&gt;Create full-fidelity ETL with SQL&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="164up"&gt;Since launching ObjectRef in preview, a powerful, highly effective pattern has emerged among our users: &lt;b&gt;building full-fidelity ETL pipelines entirely with SQL.&lt;/b&gt;&lt;/p&gt;&lt;p data-block-key="4sfbe"&gt;The diagram below shows the 4 ways to get ObjectRefs for processing unstructured data with BigQuery AI and further querying the multimodal data with AI agents.&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/image1_4ahVBX3.max-1000x1000.png"
        
          alt="image1"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="pgq21"&gt;Teams are leveraging BigQuery’s serverless architecture to integrate AI/ML directly into their data environments, eliminating the need for separate compute clusters to handle data movement and inference. Managing unstructured data in GCS as standard BigQuery columns allows users to apply core data engineering best practices, such as building idempotent pipelines, ensuring reproducibility, and executing seamless backfills, directly to images, video, audio, and documents.&lt;/p&gt;&lt;p data-block-key="8pmqu"&gt;Once data is robustly prepared, teams use Gemini within BigQuery to execute full-fidelity ETL. They unlock &lt;b&gt;dual-layer analytics&lt;/b&gt; by extracting features and annotating unstructured data while keeping the original ObjectRef anchored in the same row. The structured outputs power fast filtering, reporting and BI dashboards, while the attached unstructured objects remain available for deep, context-heavy reasoning. For example, you might extract sentiment scores and topic tags from an archive of customer call recordings to quickly flag at-risk accounts on a BI dashboard (the structured layer). Simultaneously, a conversational analytics agent evaluating escalation processes can seamlessly fall back to the original audio files to analyze the caller and customer service representative interactions, preventing the loss of critical nuance that typically occurs in unstructured-to-structured ETL pipelines.&lt;/p&gt;&lt;h3 data-block-key="51hq"&gt;&lt;b&gt;Proven use cases from industry leaders&lt;/b&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p style="padding-left: 40px;"&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;“At Snap, the safety of our community is a top priority, and we aim to limit users’ exposure to content that violates our Community Guidelines. We regularly review samples of public posts, and by leveraging ObjectRef with BigQuery AI, we transitioned from simple random sampling to post-stratification sampling. This transition improved the efficiency of our human review processes, enabling us to reinvest reclaimed capacity into new and expanded workflows that further enhance our ability to detect and address potentially harmful content.”&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; - &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Carlos Ortiz&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Data Scientist, Snap&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;During the preview phase, we saw adoption across a variety of critical workloads. Customers have successfully transitioned these experimental pipelines into production, transforming unstructured data into actionable, structured insights:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Content moderation:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Online platforms leverage BigQuery to integrate multimedia assets with standard telemetry data in a single pipeline to fundamentally enhance their moderation and safety outcomes.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Proactive threat detection:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Enterprise security teams use BigQuery to analyze visual and structural web components alongside network logs, driving critical advancements in proactive threat identification.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Inventory compliance:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Online retailers extract text and context directly from vast image repositories to automatically flag regulatory or brand compliance issues at scale.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Customer experience:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Service-oriented enterprises analyze audio interactions between support agents and customers with BigQuery AI to evaluate customer sentiment and improve service delivery.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;New in GA&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;We streamlined the developer experience for the General Availability release, focusing on support for a wide variety of customer use cases:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Flexible authentication:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="2" style="list-style-type: circle; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;In GA, we introduced &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;End User Credentials (EUC) support for ObjectRefs&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;. Users can now quickly query and explore unstructured data using their personal IAM identity directly for ad-hoc analysis.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="2" style="list-style-type: circle; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;In preview, querying unstructured files required setting up explicit BigQuery connections for &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;ObjectRefs&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;. While these connections remain fully supported and are the &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;recommended best practice for robust, service-account-driven production pipelines&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;, we recognize they require additional setup.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Unified support for your Cloud Storage metadata:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; We know your unstructured data’s metadata lives in various places across Google Cloud, and &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;ObjectRef&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; now supports all of them. &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;strong&gt;If it's already in a table:&lt;/strong&gt; Whether your metadata currently resides in &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;BigQuery object tables&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Cloud Storage insights datasets&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;, or simply as &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;raw string URIs&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; within standard BigQuery tables, you can seamlessly create and manage ObjectRefs to analyze the underlying data.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;strong&gt;If it isn't in a table: &lt;/strong&gt;T&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;he new &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;OBJ.LIST&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; function lists files directly from a Cloud Storage path and returns an &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;ObjectRef&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; for each one, so you don't need to create a table first.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Array support for comparative analytics:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; We introduced native support for processing &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;ObjectRefs&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; contained within arrays. This enables entirely new classes of workloads, such as comparing multiple documents against one another, analyzing sequences of images, or batching items in a single semantic call.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;See it in action: End-to-end multimodal analytics&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To illustrate the power of these GA updates, let's look at how you can build real-world, multimodal pipelines using our streamlined SQL operators.&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;&lt;strong style="vertical-align: baseline;"&gt;1. Full-fidelity ETL: Call center audio analysis&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Analyzing customer service calls historically required moving audio files to specialized transcription and natural language processing clusters. With &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;ObjectRef&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;, you can parse audio files, extract structured business intelligence and add them directly as standard relational columns.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Use the GA &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;OBJ.MAKE_REF()&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; function to automatically detect the audio format from a raw string URI and BigQuery’s &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/generative-ai-overview#managed_ai_functions"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;managed AI functions&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; for well known use-cases. For example, you can use &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;AI.CLASSIFY()&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; to categorize customer call types. By default, BigQuery uses &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/optimize-ai-functions"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Optimized Mode for AI Functions&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to reduce the number of tokens consumed.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;CREATE OR REPLACE TABLE call_center.annotated_call_logs AS\r\nSELECT \r\n  customer_id,\r\n  call_date,\r\n  OBJ.MAKE_REF(audio_uri) as ref,\r\n  AI.CLASSIFY(\r\n    OBJ.MAKE_REF(audio_uri), [\r\n      &amp;quot;Lost or stolen card&amp;quot;, \r\n      &amp;quot;Declined card payment&amp;quot;, \r\n      &amp;quot;Activate my card&amp;quot;,\r\n      &amp;quot;Order physical card&amp;quot;,\r\n      &amp;quot;Cancel transfer&amp;quot;,\r\n      &amp;quot;Password or pin forgotten&amp;quot;,\r\n      &amp;quot;Virtual card not working&amp;quot;,\r\n      &amp;quot;Card swallowed by ATM&amp;quot;,\r\n      &amp;quot;Balance not updated after bank transfer&amp;quot;,\r\n      &amp;quot;Balance not updated after check or cash deposit&amp;quot;,\r\n      &amp;quot;Extra charge on statement&amp;quot;,\r\n      &amp;quot;Transfer fee charged&amp;quot;\r\n    ]\r\n  ) AS customer_issue_type,\r\n  FROM \r\n  call_center.raw_call_logs;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb896e593d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;p data-block-key="pgq21"&gt;This table can serve as a multimodal data source for a BigQuery conversational analytics agent. The agent translates natural language queries into SQL using BigQuery AI functions to analyze audio files when additional information is needed.&lt;/p&gt;&lt;p data-block-key="ed7n5"&gt;Go to the Agents tab in BigQuery to create a conversational analytics agent and select your multimodal table as a source.&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/image2_folidzi.max-1000x1000.png"
        
          alt="image2"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;div data-draftjs-conductor-fragment='{"blocks":[{"key":"chj9","text":"2. At-scale gen AI filtering: Product compliance","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":48,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"4upgp","text":"Data engineers frequently need to filter massive datasets based on the contents of images or documents. Instead of running heavy generative queries and parsing text outputs, you can now use the declarative AI.IF() operator natively alongside your standard SQL in WHERE clauses. The default Optimized Mode reduces the number of tokens consumed to further optimize your workloads.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[{"offset":290,"length":14,"key":0}],"data":{}}],"entityMap":{"0":{"type":"LINK","mutability":"MUTABLE","data":{"url":"https://docs.cloud.google.com/bigquery/docs/optimize-ai-functions"}}}}'&gt;
&lt;div class="Draftail-block--unstyled" data-block="true" data-editor="7rk9m" data-offset-key="pgq21-0-0"&gt;
&lt;h4 class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="pgq21-0-0"&gt;&lt;span data-offset-key="pgq21-0-0"&gt;2. At-scale gen AI filtering: Product compliance&lt;/span&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;div class="Draftail-block--unstyled" data-block="true" data-editor="7rk9m" data-offset-key="4t3lt-0-0"&gt;
&lt;div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4t3lt-0-0"&gt;&lt;span data-offset-key="4t3lt-0-0"&gt;Data engineers frequently need to filter massive datasets based on the contents of images or documents. Instead of running heavy generative queries and parsing text outputs, you can now use the declarative AI.IF() operator natively alongside your standard SQL in WHERE clauses. The default &lt;/span&gt;&lt;a class="TooltipEntity" data-draftail-trigger="true" href="https://docs.cloud.google.com/bigquery/docs/optimize-ai-functions" role="button"&gt;&lt;span data-offset-key="4t3lt-1-0"&gt;Optimized Mode&lt;/span&gt;&lt;/a&gt;&lt;span data-offset-key="4t3lt-2-0"&gt; reduces the number of tokens consumed to further optimize your workloads.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;SELECT \r\n  product_id,\r\n  seller_id,\r\nFROM \r\n  ecommerce.vendor_uploads\r\nWHERE \r\n  upload_date &amp;gt;= CURRENT_DATE() - 1 AND\r\n  AI.IF((&amp;quot;Does this product image contain a restricted item or policy violation?&amp;quot;, OBJ.MAKE_REF(image_uri)))&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb896e58450&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;div data-draftjs-conductor-fragment="{&amp;quot;blocks&amp;quot;:[{&amp;quot;key&amp;quot;:&amp;quot;dfvir&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;3. Ad-hoc discovery: Product catalog enrichment&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;unstyled&amp;quot;,&amp;quot;depth&amp;quot;:0,&amp;quot;inlineStyleRanges&amp;quot;:[{&amp;quot;offset&amp;quot;:0,&amp;quot;length&amp;quot;:47,&amp;quot;style&amp;quot;:&amp;quot;BOLD&amp;quot;}],&amp;quot;entityRanges&amp;quot;:[],&amp;quot;data&amp;quot;:{}},{&amp;quot;key&amp;quot;:&amp;quot;8cmkf&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;The examples above start from tables that already hold your file URIs. If you don't have one yet, OBJ.LIST turns a Cloud Storage path into queryable rows, each with an ObjectRef in the ref column, so you can list files, send them to Gemini, and get typed columns back in a single query. Try it on the public sample bucket:&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;unstyled&amp;quot;,&amp;quot;depth&amp;quot;:0,&amp;quot;inlineStyleRanges&amp;quot;:[],&amp;quot;entityRanges&amp;quot;:[],&amp;quot;data&amp;quot;:{}}],&amp;quot;entityMap&amp;quot;:{}}"&gt;
&lt;div class="Draftail-block--unstyled" data-block="true" data-editor="8l5cp" data-offset-key="db0sr-0-0"&gt;
&lt;h4 class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="db0sr-0-0"&gt;&lt;span data-offset-key="db0sr-0-0"&gt;3. Ad-hoc discovery: Product catalog enrichment&lt;/span&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;div class="Draftail-block--unstyled" data-block="true" data-editor="8l5cp" data-offset-key="32j90-0-0"&gt;
&lt;div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="32j90-0-0"&gt;&lt;span data-offset-key="32j90-0-0"&gt;The examples above start from tables that already hold your file URIs. If you don't have one yet, OBJ.LIST turns a Cloud Storage path into queryable rows, each with an ObjectRef in the ref column, so you can list files, send them to Gemini, and get typed columns back in a single query. Try it on the public sample bucket:&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;SELECT\r\n  uri,\r\n  size,\r\n  updated,\r\n  result.animal_type,\r\n  result.item_color\r\nFROM (\r\n  SELECT\r\n    uri,\r\n    size,\r\n    updated,\r\n    AI.GENERATE(\r\n      (&amp;quot;What type of animal is this pet product for, and what is its primary color?&amp;quot;, ref),\r\n      output_schema =&amp;gt; \&amp;#x27;animal_type STRING, item_color STRING\&amp;#x27;\r\n    ) AS result\r\n  FROM\r\n    OBJ.LIST(\&amp;#x27;gs://cloud-samples-data/bigquery/tutorials/cymbal-pets/images/*.png\&amp;#x27;)\r\n);&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb896e5b0d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;div data-draftjs-conductor-fragment='{"blocks":[{"key":"c18kb","text":"3. Multi-object reasoning: Proactive threat detection","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":53,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"69u54","text":"With native array support in GA, you can now pass an array of ObjectRefs into a single Gemini call to analyze multiple files simultaneously using Gemini.","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"46dq9","text":"This unlocks complex comparative logic directly in SQL. For example, a security team can pass a screenshot of their official login page and a screenshot of a newly discovered, suspicious webpage to Gemini simultaneously to detect phishing attempts at scale:","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}}],"entityMap":{}}'&gt;
&lt;div class="Draftail-block--unstyled" data-block="true" data-editor="bsig4" data-offset-key="pgq21-0-0"&gt;
&lt;h4 class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="pgq21-0-0"&gt;&lt;span data-offset-key="pgq21-0-0"&gt;4. Multi-object reasoning: Proactive threat detection&lt;/span&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;div class="Draftail-block--unstyled" data-block="true" data-editor="bsig4" data-offset-key="fc9sj-0-0"&gt;
&lt;div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="fc9sj-0-0"&gt;&lt;span data-offset-key="fc9sj-0-0"&gt;With native array support in GA, you can now pass an array of ObjectRefs into a single Gemini call to analyze multiple files simultaneously using Gemini.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="Draftail-block--unstyled" data-block="true" data-editor="bsig4" data-offset-key="1ji87-0-0"&gt;
&lt;div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="1ji87-0-0"&gt;&lt;span data-offset-key="1ji87-0-0"&gt;This unlocks complex comparative logic directly in SQL. For example, a security team can pass a screenshot of their official login page and a screenshot of a newly discovered, suspicious webpage to Gemini simultaneously to detect phishing attempts at scale:&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;SELECT \r\n  log_id,\r\n  suspect_domain,\r\n  assessment.is_phishing,\r\n  assessment.visual_discrepancies\r\nFROM (\r\n  SELECT \r\n    log_id,\r\n    suspect_domain,\r\n    AI.GENERATE(\r\n      (\r\n        &amp;quot;Compare these two web UI screenshots. The first is our official, trusted login page. The second is a suspected spoofed page. Identify any visual discrepancies, missing logos, or fake elements, and determine if it is a phishing attempt.&amp;quot;, \r\n        [OBJ.MAKE_REF(trusted_ui_uri),OBJ.MAKE_REF(suspect_ui_uri)]\r\n      ),\r\n      output_schema =&amp;gt; \&amp;#x27;is_phishing BOOLEAN, visual_discrepancies STRING\&amp;#x27;\r\n    ) AS assessment\r\n  FROM \r\n    cybersecurity.network_ui_logs\r\n);&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb896e58a50&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph"&gt;&lt;h3 data-block-key="pgq21"&gt;&lt;b&gt;Start analyzing today&lt;/b&gt;&lt;/h3&gt;&lt;p data-block-key="bcmf8"&gt;BigQuery ObjectRef is now generally available on all BigQuery editions and on-demand pricing tiers.&lt;/p&gt;&lt;p data-block-key="aimb0"&gt;If you are currently managing complex, fragmented infrastructure just to perform machine learning inference on your Cloud Storage files, it's time to consolidate. Bring AI directly to your storage. Start leveraging your existing data engineering practices to build robust, scalable, and secure multimodal analytics pipelines directly within BigQuery.&lt;/p&gt;&lt;p data-block-key="ensan"&gt;To get started with ObjectRef and multimodal analytics, check out these resources:&lt;/p&gt;&lt;ul&gt;&lt;li data-block-key="2ak8t"&gt;Walk through our &lt;a href="https://docs.cloud.google.com/bigquery/docs/multimodal-data-sql-tutorial"&gt;hands-on tutorial&lt;/a&gt; to generate image captions and assign product categories using synthetic data.&lt;/li&gt;&lt;li data-block-key="5hgmk"&gt;Watch live demos from Cloud Next about &lt;a href="https://www.youtube.com/watch?v=hBg8FB6vCQ8&amp;amp;t=1s" target="_blank"&gt;unifying unstructured and structured data&lt;/a&gt;, and &lt;a href="https://www.youtube.com/watch?v=dPcta6Jvuvs&amp;amp;t=2s" target="_blank"&gt;generating text with LLMs and performing vector search&lt;/a&gt;.&lt;/li&gt;&lt;li data-block-key="eseqa"&gt;Learn &lt;a href="https://docs.cloud.google.com/bigquery/docs/work-with-objectref"&gt;how to work with ObjectRef&lt;/a&gt; in the BigQuery documentation.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description><pubDate>Wed, 21 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/data-analytics/analyze-unstructured-data-in-bigquery-with-objectref/</guid><category>BigQuery</category><category>Data Analytics</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>BigQuery ObjectRef now GA: Build multimodal data platforms for conversational analytics entirely in SQL</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/data-analytics/analyze-unstructured-data-in-bigquery-with-objectref/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Gaurav Soni</name><title>Engineering Manager</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Jamy Su</name><title>Product Manager</title><department></department><company></company></author></item><item><title>How to Use Python UDF Logging for Pipeline Observability</title><link>https://cloud.google.com/blog/products/data-analytics/python-udf-logging-for-pipeline-observability-in-bigquery/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;We are announcing  a new &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/user-defined-functions-python#use_logging"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;logging feature &lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;that  is now available in Python User-Defined Function (UDF) in BigQuery. Developers can now use Python’s standard logging library directly inside BigQuery UDFs to emit structured logs seamlessly into Cloud Logging—with zero external plugins or custom connectors required.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;While UDF logging enables a wide range of operational monitoring and debugging workflows, to demonstrate this feature we are showcasing an example for building fault-tolerant, resilient data pipelines. In the example below, we are capturing row-level diagnostic telemetry during query execution, so that teams can easily isolate problematic records, trigger real-time alerts, and triage issues via SQL without halting entire workloads.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In this post, we’ll show you how to get started with Python UDF logging and walk through an e-commerce event ingestion pipeline as a practical, end-to-end example.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Architecture overview&lt;/span&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/image1_D3BL7NE.max-1000x1000.jpg"
        
          alt="image1"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The workflow consists of three stages:&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Inline validation&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: The Python UDF parses incoming JSON payloads. Valid records pass to the destination table; corrupted or non-compliant rows trigger &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;logging.error()&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; and return &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;NULL&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; to prevent query failure.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Real-time alerting&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: A Cloud Monitoring log-based metric notifies your team when error rates breach SLA thresholds.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;SQL triage &amp;amp; replay&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Data engineers query the quarantined payloads in BigQuery using standard SQL over the linked &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;_AllLogs&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; view, diagnose the root cause, and re-ingest recovered data.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Although this specific demonstration relies on Python for data validation and transformation, you can seamlessly integrate Python-driven logging and validation into pipelines that perform SQL-based transformations.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Quickstart walkthrough: Step-by-step&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Step 1: Create the generic Python UDF&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This UDF parses JSON and checks for a required field. If parsing fails or the required key is missing, it logs structured diagnostic JSON and returns &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;NULL&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;CREATE OR REPLACE FUNCTION `YOUR_PROJECT.YOUR_DATASET.safe_parse_json`(\r\n    raw_payload STRING,\r\n    required_key STRING\r\n)\r\nRETURNS STRING\r\nLANGUAGE python\r\nOPTIONS (entry_point=\&amp;#x27;safe_parse_json\&amp;#x27;, runtime_version=\&amp;#x27;python-3.11\&amp;#x27;)\r\nAS r\&amp;#x27;\&amp;#x27;\&amp;#x27;\r\nimport json\r\nimport logging\r\n\r\ndef safe_parse_json(raw_payload, required_key):\r\n    if not raw_payload or raw_payload.strip() == &amp;quot;&amp;quot;:\r\n        logging.warning(json.dumps({&amp;quot;error_type&amp;quot;: &amp;quot;EMPTY_PAYLOAD&amp;quot;}))\r\n        return None\r\n\r\n    try:\r\n        data = json.loads(raw_payload)\r\n        if required_key and (required_key not in data or data[required_key] is None):\r\n            logging.error(json.dumps({\r\n                &amp;quot;error_type&amp;quot;: &amp;quot;MISSING_REQUIRED_KEY&amp;quot;,\r\n                &amp;quot;missing_key&amp;quot;: required_key,\r\n                &amp;quot;raw_payload&amp;quot;: raw_payload[:200]\r\n            }))\r\n            return None\r\n        return json.dumps(data)\r\n\r\n    except Exception as e:\r\n        logging.error(json.dumps({\r\n            &amp;quot;error_type&amp;quot;: &amp;quot;JSON_SYNTAX_ERROR&amp;quot;,\r\n            &amp;quot;error_message&amp;quot;: str(e),\r\n            &amp;quot;raw_payload&amp;quot;: raw_payload[:200]\r\n        }))\r\n        return None\r\n\&amp;#x27;\&amp;#x27;\&amp;#x27;;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb897e504d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Step 2: Run ingestion with logging enabled&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In this example, we simulate an e-commerce event ingestion pipeline processing incoming user actions (&lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;click&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;view&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;checkout&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;). Our goal is to extract valid events into our clean analytics table while gracefully quarantining broken or missing-schema payloads.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Enable logging in your session with &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;SET @@udf.properties&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;SET @@udf.properties = JSON \&amp;#x27;{&amp;quot;enableDebugOutput&amp;quot;: true}\&amp;#x27;;\r\n\r\nCREATE OR REPLACE TABLE `YOUR_PROJECT.YOUR_DATASET.clean_events` AS\r\nWITH sample_events AS (\r\n SELECT \&amp;#x27;evt_001\&amp;#x27; AS event_id, \&amp;#x27;{&amp;quot;user_id&amp;quot;: &amp;quot;usr_101&amp;quot;, &amp;quot;event&amp;quot;: &amp;quot;click&amp;quot;, &amp;quot;amount&amp;quot;: 25.5}\&amp;#x27; AS raw_data UNION ALL\r\n SELECT \&amp;#x27;evt_002\&amp;#x27; AS event_id, \&amp;#x27;corrupted_json{\&amp;#x27; AS raw_data UNION ALL                                 -- Syntax error\r\n SELECT \&amp;#x27;evt_003\&amp;#x27; AS event_id, \&amp;#x27;{&amp;quot;event&amp;quot;: &amp;quot;view&amp;quot;}\&amp;#x27; AS raw_data UNION ALL                               -- Missing required user_id\r\n SELECT \&amp;#x27;evt_004\&amp;#x27; AS event_id, \&amp;#x27;{&amp;quot;user_id&amp;quot;: &amp;quot;usr_102&amp;quot;, &amp;quot;event&amp;quot;: &amp;quot;checkout&amp;quot;, &amp;quot;amount&amp;quot;: 99.0}\&amp;#x27; AS raw_data\r\n),\r\nparsed_events AS (\r\n SELECT\r\n   event_id,\r\n   `YOUR_PROJECT.YOUR_DATASET.safe_parse_json`(raw_data, \&amp;#x27;user_id\&amp;#x27;) AS validated_json\r\n FROM sample_events\r\n)\r\nSELECT\r\n event_id,\r\n JSON_VALUE(validated_json, \&amp;#x27;$.user_id\&amp;#x27;) AS user_id,\r\n JSON_VALUE(validated_json, \&amp;#x27;$.event\&amp;#x27;) AS event_name,\r\n \&amp;#x27;VALID\&amp;#x27; AS status\r\nFROM parsed_events\r\nWHERE validated_json IS NOT NULL;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb897e52310&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;Ingestion Results&lt;/span&gt;&lt;/h4&gt;
&lt;div align="left"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;&lt;table style="width: 96.4752%;"&gt;&lt;colgroup&gt;&lt;col style="width: 24.8377%;"/&gt;&lt;col style="width: 22.627%;"/&gt;&lt;col style="width: 31.9899%;"/&gt;&lt;col style="width: 20.5464%;"/&gt;&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;event_id&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;th scope="col" style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;user_id&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;th scope="col" style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;event_name&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;th scope="col" style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;status&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;evt_001&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;usr_101&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;click&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;VALID&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;evt_004&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;usr_102&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;checkout&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;VALID&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;The query succeeds without interruption while bad rows (2 and 3) are routed to Cloud Logging.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Step 3: Set up real-time alerts on Cloud Logging&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;You can configure alerts to notify your on-call team as soon as malformed payloads exceed acceptable thresholds.&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;In the Google Cloud Console (1-Click)&lt;/span&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;In the Google Cloud Console, open &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Logs Explorer&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Paste the log filter for your UDF routine:&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;resource.type=&amp;quot;bigquery.googleapis.com/ManagedRoutineInvocation&amp;quot;\r\nseverity&amp;gt;=ERROR&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb897b06250&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;3. Click &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Create alert&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; in the top action bar.&lt;/span&gt;&lt;/p&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;4. Set your notification channels (e.g., Slack, PagerDuty, or Email) and save the policy.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Step 4: Triage bad rows with BigQuery Log Analytics&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;"Note: To query your logs via BigQuery SQL, ensure you have enabled&lt;/span&gt;&lt;a href="https://cloud.google.com/logging/docs/log-analytics"&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;BigQuery Log Analytics&lt;/span&gt;&lt;/a&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt; on your Cloud Logging bucket and created a linked dataset."&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Query the quarantined payloads using BigQuery SQL via the linked &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;_AllLogs&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;view:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;SELECT\r\n    timestamp,\r\n    severity,\r\n    JSON_VALUE(json_payload.error_type) AS error_type,\r\n    JSON_VALUE(json_payload.missing_key) AS missing_key,\r\n    JSON_VALUE(json_payload.raw_payload) AS raw_payload\r\nFROM `YOUR_PROJECT.YOUR_LOGS_LINKED_DATASET._AllLogs`\r\nWHERE log_name LIKE &amp;#x27;%managed_routine_output%&amp;#x27;\r\nORDER BY timestamp DESC\r\nLIMIT 10;&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8a8b71e90&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;Log Analytics output&lt;/span&gt;&lt;/h4&gt;
&lt;div align="left"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;&lt;table&gt;&lt;colgroup&gt;&lt;col/&gt;&lt;col/&gt;&lt;col/&gt;&lt;col/&gt;&lt;col/&gt;&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;timestamp&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;th scope="col" style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;severity&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;th scope="col" style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;error_type&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;th scope="col" style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;missing_key&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;th scope="col" style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;raw_payload&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;2026-09-17 18:35:50&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;ERROR&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;MISSING_REQUIRED_KEY&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;user_id&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;{"event": "view"}&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;2026-09-17 18:35:50&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;ERROR&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;JSON_SYNTAX_ERROR&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;null&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;corrupted_json{&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Recovering data&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Because full raw payloads are preserved in Cloud Logging, you can recover quarantined records directly with SQL once upstream data is fixed:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;-- 1. Replay and recover quarantined rows from Cloud Logging sink table\r\nINSERT INTO `YOUR_PROJECT.YOUR_DATASET.clean_events` (event_id, user_id, event_name, status)\r\nSELECT\r\n &amp;#x27;evt_003_recovered&amp;#x27; AS event_id,\r\n &amp;#x27;default_user&amp;#x27; AS user_id, -- Apply fallback default for the missing field\r\n JSON_VALUE(JSON_VALUE(json_payload.raw_payload), &amp;#x27;$.event&amp;#x27;) AS event_name,\r\n &amp;#x27;RECOVERED&amp;#x27; AS status\r\nFROM `YOUR_PROJECT.YOUR_LOGS_LINKED_DATASET._AllLogs`\r\nWHERE JSON_VALUE(json_payload.error_type) = &amp;#x27;MISSING_REQUIRED_KEY&amp;#x27;\r\n\r\n-- 2. Inspect the final clean destination table\r\nSELECT event_id, user_id, event_name, status\r\nFROM `YOUR_PROJECT.YOUR_DATASET.clean_events`\r\nORDER BY event_id;&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8a8b727d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;Final &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;clean_events&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; Table Result:&lt;/span&gt;&lt;/h4&gt;
&lt;div align="left"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;&lt;table style="width: 95.4308%;"&gt;&lt;colgroup&gt;&lt;col style="width: 32.1722%;"/&gt;&lt;col style="width: 22.9553%;"/&gt;&lt;col style="width: 22.4336%;"/&gt;&lt;col style="width: 22.6075%;"/&gt;&lt;/colgroup&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;event_id&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;user_id&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;event_name&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;status&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;evt_001&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;usr_101&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;click&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;VALID&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;evt_004&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;usr_102&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;checkout&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;VALID&lt;/code&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;evt_003_recovered&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;default_user&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;view&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;RECOVERED&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;All valid and recovered data is now unified in the production table without any data loss.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Other use cases&lt;/span&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Shadow execution &amp;amp; safe migrations&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Run legacy and new business logic side-by-side in a UDF. Return the legacy result to production while logging calculation differences to Cloud Logging.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;PII redaction auditing&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Mask sensitive tokens (such as SSNs or account numbers) before writing to BigQuery, while emitting anonymized audit events to Cloud Logging.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;ML inference drift&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Log warnings when embedded scoring logic encounters out-of-vocabulary inputs or low model confidence.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Best practices&lt;/span&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Enable debug output&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Include &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;SET @@udf.properties = JSON '{"enableDebugOutput": true}';&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; in the session where you want logs captured.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Avoid sensitive data in logs&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Cloud Logging is visible to users with Logging Viewer permissions. Do not log credentials or secrets.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Cost management&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: On high-throughput pipelines, log selectively (e.g., only on errors or via sampling) to manage logging ingestion volume.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;span style="vertical-align: baseline;"&gt;Getting started&lt;/span&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://cloud.google.com/bigquery/docs/user-defined-functions-python"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;BigQuery Python UDF Documentation&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://cloud.google.com/logging/docs/log-analytics"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;BigQuery Log Analytics Overview&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><pubDate>Mon, 19 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/data-analytics/python-udf-logging-for-pipeline-observability-in-bigquery/</guid><category>BigQuery</category><category>Data Analytics</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>How to Use Python UDF Logging for Pipeline Observability</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/data-analytics/python-udf-logging-for-pipeline-observability-in-bigquery/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Cong Du</name><title>Software Engineer</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Ming Ma</name><title>Software Engineer</title><department></department><company></company></author></item><item><title>Bringing the borderless Lakehouse into the agentic era with innovations for Gemini</title><link>https://cloud.google.com/blog/products/data-analytics/borderless-lakehouse-integrates-with-gemini/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;As enterprises shift their AI usage from experimental chatbots to autonomous agents, teams are hitting a critical bottleneck: accessing and reasoning over data scattered across multiple clouds, SaaS platforms, and on-premises systems. To turn AI agents into true systems of action, organizations need a foundation that can handle petabyte-scale reasoning without the security risks of data movement. Last week at our &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/welcome-to-gemini-at-work-2026"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Gemini at Work&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; event, we announced how Gemini can help you transform business workflows. To help power your agents with your enterprise data, we will dive deeper into the new Gemini integration with borderless Lakehouse to help you build, secure, and scale agents that work across your data estate.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Access data that lives outside of Google Cloud through Gemini &lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The ultimate value of the borderless Lakehouse is realized through the agents you build to transform your organization, with Gemini as the front door. With the new Gemini integration, data that’s either preconfigured or stored in your borderless Lakehouse is now directly integrated into Gemini. Currently in preview, this means you can set up access to new data sources, such as Databricks Unity Catalog or Snowflake Horizon, through Lakehouse catalog federation directly from Gemini. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Now your business users can use natural language to query records that live across clouds while your AI agents can ground their reasoning and generate code from the same data — all without moving it. By directly contextualizing AI agents across your borderless Lakehouse, you can help accelerate your organization’s AI adoption while simplifying access to critical information.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/image1_HJqokGb.gif"
        
          alt="image1"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="bhjex"&gt;Gemini agents invoked by business users can access data that lives in BigQuery and Databricks Unity Catalog to provide comprehensive reporting and get insights using natural language.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Borderless Lakehouse advancements&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In addition to this new, native integration with Gemini, we’re sharing  that several features we introduced earlier this year to power your data foundation with the borderless Lakehouse are now generally available, including:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Support for Cross-Cloud Interconnect and cross-cloud caching for AWS and Azure&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;BigQuery support for Apache Iceberg V3 specifications&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Read-write interoperability on Apache Iceberg tables for both BigQuery and Managed Service for Apache Spark&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Bi-directional caching with AWS Glue, Databricks Unity Catalog, and Snowflake Horizon Catalog using Lakehouse runtime federation &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Integration with Knowledge Catalog&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Zero-copy data integration with Salesforce, SAP and Workday, and now, Confluent Tableflow&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Synchronization of Databricks Delta Lake assets through the Lakehouse console using Dataflow&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Let’s explore.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Performance and reasoning at petabyte scale&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;While agent context windows are typically limited to ingesting hundreds of kilobytes at a time, enterprise workflows sometimes join petabytes of data across clouds. An agent-native data platform that needs to combine data across sources, like product and customer data, to your CRM cloud and warehouse telemetry needs to be able to process data at scale. When you do this over MCP, you are limited to megabyte scale because of context windows and payload size. By integrating at every layer of the data and AI stack, the borderless Lakehouse provides enterprise-grade scalability, enabling agents to reason over petabytes of data with similar performance to it being stored locally. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;At the networking layer, &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/network-connectivity/docs/interconnect/concepts/cci-overview"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Cross-Cloud Interconnect&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/lakehouse/docs/about-cross-cloud-data-access"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;cross-cloud caching&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; provide high-throughput, low-latency paths to AWS and Azure, eliminating variable egress fees. When an agent joins Iceberg tables in Amazon Azure Data Lake Storage with data in BigQuery, every uncached byte it scans crosses a cloud boundary, so the network sets the pace. Cross-Cloud Interconnect gives the Lakehouse a dedicated, private connection between Google Cloud and AWS or Azure, at 10 Gbps or 100 Gbps per connection. Lakehouse queries travel over that connection rather than the public internet, so latency stays low and predictable. Cross-cloud caching serves repeat reads from inside Google Cloud, so agents can query data in other clouds without migrating it.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The borderless Lakehouse includes several key optimizations to integrate Iceberg metadata within the query engine. BigQuery now supports &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/lakehouse/docs/use-iceberg-v3-binary-deletion-vectors"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Apache Iceberg V3 specifications,&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; including binary deletion vectors and sort orders. These features allow the engine to handle row-level updates and deletes more efficiently by eliminating the need to rewrite entire data files. We also upgraded BigQuery’s execution engine with a new FlatBuffers-based Parquet reader and parallelized I/O to help reduce CPU overhead and serialization bottlenecks and narrow the performance gap between open formats and native storage.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This builds upon recent performance innovations to the query engine designed to support agent workloads, which often come in herds and need to process small queries quickly and cost effectively. With &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/bigquery-performance-optimizations"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;BigQuery fluid scaling and history based optimizations&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, you can run scalable and efficient agent workloads while maintaining openness with Apache Iceberg. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Meanwhile, read-write interoperability on Apache Iceberg tables for both &lt;/span&gt;&lt;a href="https://cloud.google.com/bigquery"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;BigQuery&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;a href="https://cloud.google.com/products/managed-service-for-apache-spark"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Managed Service for Apache Spark&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; makes it easy for all of your data teams to work off the same Iceberg tables in Google Cloud Storage. This vertically optimized stack helps make your agents faster and more cost-effective, leveraging the power of BigQuery and &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/introducing-lightning-engine-for-apache-spark?e=48754805"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Lightning Engine&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to activate data without moving it. To expand the analytical depth of the lakehouse, graph support for Iceberg in BigQuery lets you analyze relationship networks, such as supply chains, directly on open table datasets.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Comprehensive context and data access for your agents&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;An AI agent is only as smart as the context it can access. To help prevent hallucinations and improve accuracy at the metadata layer, the borderless Lakehouse unifies your enterprise data using the &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/lakehouse/docs/about-lakehouse-catalogs"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Lakehouse runtime catalog&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. Based on the Apache Iceberg REST Catalog, it provides bi-directional catalog federation with AWS Glue, Databricks Unity Catalog, and Snowflake Horizon Catalog. The Lakehouse runtime catalog also includes a new standard Hive Metastore-compatible endpoint, allowing engines like Apache Spark, Trino, and Presto to discover metadata without architectural changes. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The borderless Lakehouse also integrates directly with &lt;/span&gt;&lt;a href="https://cloud.google.com/products/knowledge-catalog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Knowledge Catalog&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, which automatically indexes your distributed data assets, to provide the precise business metadata and semantic definitions agents need to reason over your entire enterprise corpus — including unstructured data in Cloud Storage. This gives agents just enough context to be accurate while controlling token costs, helping you develop an intelligent and sustainable agentic strategy. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The borderless Lakehouse provides zero-copy data integration with your SaaS applications like Salesforce, SAP and Workday and integrates with a larger partner ecosystem, capturing enterprise data in Knowledge Catalog and acting as a single context engine for your agents. Today, we’re expanding the partner ecosystem with new integrations for Confluent Tableflow, now generally available, which syncs to Lakehouse runtime catalog so the Iceberg tables it produces show up directly in BigQuery, with no copying and no extra ETL. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Finally, organizations with Databricks-centric repositories can now easily import, transform and synchronize their Delta Lake assets into Lakehouse through the &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/lakehouse/docs/import-delta-lake-tables"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Lakehouse console&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; using Dataflow.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Modernize with ease&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Customer use of Apache Iceberg has more than tripled since the beginning of 2025, and enterprises building with Google Cloud’s borderless Lakehouse are seeing significant impact from it: &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://cloud.google.com/customers/etsy-lakehouse"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Etsy&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; unified three petabytes with borderless Lakehouse, joining data in place to accelerate pipeline queries by 60%. &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://www.youtube.com/watch?v=Er6iwuxcC-8" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Commerzbank&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; transforms raw distributed data into governed, agent-ready access.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://hightouch.com/blog/introducing-hightouch-for-google-cloud-cross-cloud-lakehouse" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Hightouch&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; integrates directly with borderless Lakehouse so teams can power their marketing directly on an open Iceberg lakehouse and activate that data across the Google Cloud ecosystem.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://cloud.google.com/customers/target"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Roundel&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; modernized its Target Product Ads technology stack from the ground up with borderless Lakehouse, completely rebuilding its data ingestion, processing, and measurement pipelines. &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;If you are ready to get started with the transition to borderless Lakehouse for your organization, it doesn’t need to be difficult. For organizations currently using legacy Dataproc Metastore, we now offer an automated, zero-downtime migration path to the serverless Lakehouse runtime catalog. This preserves your existing schemas and lineage while unlocking the AI-ready features of the borderless Lakehouse, so you can stop managing infrastructure and start activating agents.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Get started today with the &lt;/span&gt;&lt;a href="https://codelabs.developers.google.com/next26/multicloud-lakehouse#0" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Build a borderless Lakehouse codelab&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; or visit &lt;/span&gt;&lt;a href="https://cloud.google.com/solutions/data-lakehouse/"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;our website&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to learn more.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Thu, 15 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/data-analytics/borderless-lakehouse-integrates-with-gemini/</guid><category>Data Analytics</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Bringing the borderless Lakehouse into the agentic era with innovations for Gemini</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/data-analytics/borderless-lakehouse-integrates-with-gemini/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Gaurav Saxena</name><title>Director, Product Management</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Ahmet Altay</name><title>Director, Engineering</title><department></department><company></company></author></item><item><title>Predictable AI spend in BigQuery: Introducing cost management for generative AI functions</title><link>https://cloud.google.com/blog/products/data-analytics/using-bigquerys-generative-ai-cost-management-features/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/generative-ai-overview"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;generative AI functions in BigQuery&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; (&lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;AI.GENERATE&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;AI.IF&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;AI.CLASSIFY&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;AI.SCORE&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, and more) bring large language models (LLMs) directly into your SQL, so a single query can classify millions of support tickets or score each product review for sentiment. However, because these functions are billed by the token, scaling them across massive datasets highlights the importance of managing your budget proactively. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;We recently announced the general availability (GA) of &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;token-based &lt;/strong&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/control-genai-costs"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;cost management&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt; for BigQuery generative AI functions&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: daily quotas that let administrators set self-serve guardrails on AI token consumption, so teams can innovate while staying within your budget. In this blog, we provide an overview of cost management for BigQuery generative AI functions, walk through a few practical examples, and share resources to help you get started. Let’s jump in.  &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Quotas for managing costs&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Four daily quotas, managed through the Google Cloud Identity and Access Management (IAM) quota system, provide controls at the &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;project&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; level and the &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;per-user&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; level. Per-user limits apply to each user within a project, not across your organization.&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div align="left"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;&lt;table&gt;&lt;colgroup&gt;&lt;col/&gt;&lt;col/&gt;&lt;col/&gt;&lt;col/&gt;&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Quota name&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;th scope="col" style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Metric&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;th scope="col" style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Scope&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;th scope="col" style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Default value&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;AI input tokens per day&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Input tokens used by the LLM&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Per day, per project&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;200 billion&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;AI input tokens per day per user&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Input tokens used by the LLM&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Per day, per project, per user&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;150 billion&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;AI output tokens per day&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Output and thinking tokens used by the LLM&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Per day, per project, per project&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;20 billion&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;AI output tokens per day per user&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Output and thinking tokens used by the LLM&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Per day, per project, per user&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;15 billion&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Key details:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;The quotas are global.&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Usage is summed across all regions, so costs can't pile up unnoticed in a region you weren't watching.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Output quotas include "thinking" tokens.&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Reasoning tokens count toward your output quota, just as they count toward your Gemini platform bill.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Which functions are covered?&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The quotas apply to these BigQuery functions that perform LLM-backed generation:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-ai-generate"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;AI.GENERATE&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-generate-table"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;AI.GENERATE_TABLE&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-ai-generate-text"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;AI.GENERATE_TEXT&lt;/code&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; (and its alias &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-generate-text"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;ML.GENERATE_TEXT&lt;/code&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-ai-classify"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;AI.CLASSIFY&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-ai-if"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;AI.IF&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-ai-score"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;AI.SCORE&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-ai-agg"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;AI.AGG&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;What's not covered:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Embedding functions such as &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-generate-text"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;AI.GENERATE_EMBEDDING&lt;/code&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; (also available as &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-generate-embedding"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;ML.GENERATE_EMBEDDING&lt;/code&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;) and &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-ai-embed"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;AI.EMBED&lt;/code&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; are &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;not&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; subject to these quotas, because they run on different, substantially cheaper models.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Managing your quotas&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Administrators can view and adjust the quotas directly in the &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/control-genai-costs"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Cloud console&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; as workloads change, with no support case required.&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Navigate to &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;IAM &amp;amp; Admin → &lt;/strong&gt;&lt;a href="https://console.cloud.google.com/iam-admin/quotas/list"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Quotas &amp;amp; System Limits&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Filter by service and select &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;BigQuery API&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Sort by the &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Name&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; column to bring the four AI quotas to the top.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/1_dxxy8WS.max-1000x1000.png"
        
          alt="1"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="w7qjz"&gt;Locating the gen AI token quotas in IAM &amp;amp; Admin → Quotas &amp;amp; System Limits.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;4. Find the quota, for example &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;AI input tokens per day&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;5. Open the three-dot menu and choose &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Edit quota&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;From there:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;To tighten cost control,&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; lower a quota. This takes effect immediately with no approval needed.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;To support higher usage,&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; request an increase from the same page. Many requests are auto-approved; larger increases may go through a quick review.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/2_7NmvWbT.max-1000x1000.png"
        
          alt="2"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="w7qjz"&gt;Editing a gen AI token quota in IAM &amp;amp; Admin → Quotas &amp;amp; System Limits.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;You'll need the right permissions.&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; You need one of: &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Owner&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Editor, &lt;/strong&gt;&lt;a href="https://docs.cloud.google.com/iam/docs/roles-permissions/servicemanagement#servicemanagement.quotaAdmin"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Quota Administrator&lt;/strong&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;(&lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;roles/servicemanagement.quotaAdmin&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;), or &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/iam/docs/roles-permissions/serviceusage#serviceusage.serviceUsageAdmin"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Service Usage Admin&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; (&lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;roles/serviceusage.serviceUsageAdmin&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Prefer automation?&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; You can also &lt;/span&gt;&lt;a href="https://medium.com/google-cloud/bigquery-ai-cost-guardrails-how-to-set-daily-token-limits-programmatically-02d7a35f843a" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;manage these quotas programmatically&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; through the &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/docs/quotas"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Cloud Quotas API&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;gcloud&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; CLI, and Terraform to apply consistent guardrails across projects.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Monitoring usage&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Beyond setting limits, the &lt;/span&gt;&lt;a href="https://console.cloud.google.com/iam-admin/quotas/list"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Quotas &amp;amp; System Limits&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; page displays your historical token consumption so you can quickly detect spikes and right-size your budgets. Use these trends to see how new generative AI workloads and data pipelines affect your overall token usage.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/3_sSNHw57.max-1000x1000.png"
        
          alt="3"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="w7qjz"&gt;Daily project-level token usage for a gen AI token quota in IAM &amp;amp; Admin → Quotas &amp;amp; System Limits.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/4_iYgfR4l.max-1000x1000.png"
        
          alt="4"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="w7qjz"&gt;Longer-term usage graph with selectable 7-day, 14-day, 30-day, and custom ranges.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;For a step-by-step walkthrough, see the BigQuery documentation on &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/control-genai-costs"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;controlling costs with token quotas&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Token quotas vs. billing spend caps&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Token quotas aren't the only cost guardrail in Google Cloud.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/control-genai-costs"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Token quotas (this feature)&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; are &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;preventive&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;AI-specific&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;. BigQuery tracks token usage during query execution and stops work close to the limit, with separate limits per project and per user.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Cloud Billing &lt;/strong&gt;&lt;a href="https://docs.cloud.google.com/billing/docs/how-to/budgets-spend-caps#eligible-services"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;spend caps&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; operate on &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;dollars&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; at the project and service level and can automatically block usage when a threshold is reached. They're a broad, financial backstop rather than a precise usage control, and because enforcement is not instant, some overages are incurred.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Use token quotas as your first line of defense for AI spend, and a spend cap as a project-wide safety net.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;How enforcement works&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Quotas are enforced by stopping work rather than letting a query run past your limit. A query is rejected up front with a &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;QuotaExceeded&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; error only if a quota it needs is already exhausted. Otherwise, it starts, and if a quota runs out mid-query, BigQuery stops sending new LLM calls:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Functions that support &lt;/strong&gt;&lt;code&gt;&lt;strong style="vertical-align: baseline;"&gt;max_error_ratio&lt;/strong&gt;&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; (such as &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;AI.IF&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;) return partial results if unprocessed rows stay within the ratio, and otherwise fail.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;General-purpose functions&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; (such as &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;AI.GENERATE&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;) still succeed. Skipped rows have no generated value, and their &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;status&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; field contains the quota-exceeded error.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;For details, see &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/control-genai-costs#quota_enforcement_behavior"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;quota enforcement behavior&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; in the documentation.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Sizing your input data: &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;AI.COUNT_TOKENS&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To choose quota values, it helps to know how much text your workloads send to a model. The &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-ai-count-tokens"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;AI.COUNT_TOKENS&lt;/code&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; function helps with this.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;code style="vertical-align: baseline;"&gt;AI.COUNT_TOKENS&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; returns the number of tokens a model's tokenizer produces for a text string, without making a billable generation call. Run it over a column to measure your input data:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;-- Count the input text tokens for each product review\r\nSELECT\r\n  SUM(\r\n    AI.COUNT_TOKENS(\r\n      CONCAT(&amp;#x27;Classify the sentiment of this review as positive, negative, or neutral: &amp;#x27;, review_text),\r\n\r\n      endpoint =&amp;gt; &amp;#x27;gemini-3.1-flash-lite&amp;#x27;).result) AS total_input_tokens\r\nFROM\r\n  `my_project.my_dataset.product_reviews`;&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8a8c66f90&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The count is a lower bound on input tokens. It doesn't include output or thinking tokens, the instructions each AI function adds around your input, or non-text inputs such as images. Use it to:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Gauge the input side of a workload&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; before you launch it.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Right-size your quotas&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; together with a small sample run that measures actual input and output usage.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Translate tokens into dollars&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; using the published &lt;/span&gt;&lt;a href="https://cloud.google.com/vertex-ai/generative-ai/pricing"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Gemini platform pricing&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; for your model.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;From tokens to budget: a worked example&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Suppose you want to keep a project's daily AI spend around &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;$100&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; with the &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/gemini/3-1-flash-lite"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Gemini 3.1 Flash-Lite&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; model. As of today's published pricing (BigQuery processes in batch which provides a 50% discount):&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Input tokens:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; $0.125 per 1 million tokens&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Output tokens (response + reasoning):&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; $0.75 per 1 million tokens&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;If a small sample run shows an average &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;100:1 input-to-output token ratio&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;, you can solve for a daily budget:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;Cost:   0.125 × I + 0.75 × O = 100     (I, O in millions of tokens)\r\nRatio:  I = 100 × O&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb897de48d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Solving gives about &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;754 million input tokens&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;7.54 million output tokens&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; per day. Set &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;AI input tokens per day&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;AI output tokens per day&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; to these values to hold the project near $100/day. If a project uses models with different prices, budget per model or blend the rates.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Best practices for managing AI cost&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Start with per-user quotas.&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; They stop one user or runaway experiment from draining the project's budget.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Measure before you scale.&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Use &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;AI.COUNT_TOKENS&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; to size your input, then check a small sample run in the usage chart before setting limits.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Mind the output side.&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Output tokens cost more. Where a function accepts &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;max_output_tokens&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, set it to bound generation length.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Monitor and iterate.&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Adjust limits as real usage and budgets change.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Get started&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Token-based cost management is available now. To begin:&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Open &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;IAM &amp;amp; Admin → &lt;/strong&gt;&lt;a href="https://console.cloud.google.com/iam-admin/quotas/list"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Quotas &amp;amp; System Limits&lt;/strong&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; in the Google Cloud Console and filter by &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;BigQuery API&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Review the four &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;AI-related&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;token quotas&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; and set limits that match your budget.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Use &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-ai-count-tokens"&gt;&lt;code style="text-decoration: underline; vertical-align: baseline;"&gt;AI.COUNT_TOKENS&lt;/code&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to size your input data.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;For the full details, see the documentation on &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/control-genai-costs"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;controlling generative AI costs&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;With token-based guardrails in place, your teams can use generative AI in BigQuery with the cost predictability your organization needs.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Wed, 14 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/data-analytics/using-bigquerys-generative-ai-cost-management-features/</guid><category>AI &amp; Machine Learning</category><category>BigQuery</category><category>Data Analytics</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Predictable AI spend in BigQuery: Introducing cost management for generative AI functions</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/data-analytics/using-bigquerys-generative-ai-cost-management-features/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Tushar Jaiswal</name><title>Software Engineer</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Alicia Williams</name><title>Developer Advocate</title><department></department><company></company></author></item><item><title>Cross-cloud conversational analytics made simple with open standards</title><link>https://cloud.google.com/blog/products/data-analytics/cross-cloud-conversational-analytics-with-borderless-lakehouse/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The reality for most organizations is that data lives everywhere. As engineering teams expand and adopt specialized platforms for their workloads, enterprise data naturally disperses across multiple clouds and operational systems. When analytical and AI initiatives require context from across the entire organization,these teams traditionally face a difficult trade-off: build complex extraction pipelines to copy data into a central repository or accept fragmented reporting.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Traditional architectures address this fragmentation with scheduled extraction pipelines that copy remote datasets into a central staging warehouse. This approach creates synchronization lag, adds recurring storage costs, and triggers variable network egress fees. When schemas change upstream, pipelines break, and teams spend hours reconciling metrics across out-of-sync dashboards.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;BigQuery and Google Cloud’s borderless Lakehouse offer a streamlined way to solve this challenge with a foundation based on the open Apache Iceberg REST catalog specification. Rather than moving data to the compute engine, you can bring Google Cloud compute and generative AI directly to your data, querying it in place across Databricks, Snowflake, and AWS Glue.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In this post, we walk through how to configure Databricks Unity Catalog for federation into BigQuery (AWS Glue and Snowflake set up in appendix),  run a single query joining data across all three external catalogs, and use conversational analytics in BigQuery to explore the consolidated data with natural language.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/1_dTgBJRG.max-1000x1000.png"
        
          alt="1"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="bhx8b"&gt;Figure 1: BigQuery federates metadata across external Apache Iceberg REST catalogs through Lakehouse, enabling in-place conversational analytics without data migration.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;The borderless lakehouse architecture&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This solution uses &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/lakehouse/docs/about-lakehouse-catalogs"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Lakehouse runtime catalog&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to synchronize metadata from other cloud providers, allowing you to query data with BigQuery or external open source engines through the Apache Iceberg REST catalog endpoint, all without migrating the data. Because Databricks Unity Catalog, Snowflake Horizon Catalog, and AWS Glue Data Catalog support the open Apache Iceberg REST catalog specification, you can apply a consistent connection pattern across all three platforms.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;When you run a federated query, Lakehouse runtime catalog separates metadata synchronization from storage access:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Metadata synchronization:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Lakehouse runtime catalog  periodically syncs schemas, snapshot pointers, and table definitions from the remote catalog based on a refresh schedule you define.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Direct storage access:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; During query runtime, a compatible engine reads Parquet data files directly from remote object storage, such as Amazon S3, using temporary credentials issued by the remote platform.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;All query processing runs within Google cloud compute such as &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;BigQuery&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; or &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/managed-spark/docs"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Managed Service  for Apache Spark&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. Remote Databricks clusters, Snowflake virtual warehouses, and AWS compute instances are not invoked during execution.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Authentication follows an explicit three-step deployment pattern: create the federated catalog in Google Cloud, inspect its configuration to retrieve its automatically generated service account, and grant access permissions within the remote platform.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;You can use AI to generate sample data. The schema details for tables are provided below. &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Configure Databricks Unity Catalog&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;We begin in Databricks by preparing the catalog and table. In Unity Catalog, federated access requires that your target schema be associated with an external location registered in Databricks:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;-- Run inside Databricks SQL workspace\r\nCREATE CATALOG IF NOT EXISTS dbx_retail_db;\r\n\r\n-- Declare the managed target location at the schema level\r\nCREATE SCHEMA IF NOT EXISTS dbx_retail_db.dbx_core \r\n  MANAGED LOCATION &amp;#x27;s3://my-databricks-bucket/retail/data/&amp;#x27;;\r\n\r\n-- Create the Iceberg dimension table\r\nCREATE TABLE IF NOT EXISTS dbx_retail_db.dbx_core.dim_products (\r\n    product_key INT,\r\n    product_id STRING,\r\n    product_name STRING,\r\n    category STRING,\r\n    subcategory STRING,\r\n    brand STRING,\r\n    price DOUBLE,\r\n    cost DOUBLE\r\n)\r\nUSING iceberg;&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb897d437d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;You can use AI to generate sample data. The schema details for tables are provided in each section.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Before external engines can read this table, a Databricks metastore administrator must enable &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;External data access&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; on the metastore details tab.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Go to Databricks Admin account and under User Management, create a &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;Databricks Service Principal and make a note of its UUID &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;"6ea7b861-c5a5-xxxx-xxxx-xxxxxxxxxxxx"&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Connect Databricks to BigQuery&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Next, create the federated catalog inside Google Cloud using the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;gcloud&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; command-line tool. You will need your Databricks workspace URL and the application ID of your Databricks service principal:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;export GCP_PROJECT_ID=&amp;quot;my-lakehouse-project&amp;quot;\r\nexport GCP_REGION=&amp;quot;us-central1&amp;quot;\r\n\r\ngcloud alpha biglake iceberg catalogs create dbx_retail_db \\\r\n  --project=&amp;quot;$GCP_PROJECT_ID&amp;quot; \\\r\n  --primary-location=&amp;quot;$GCP_REGION&amp;quot; \\\r\n  --catalog-type=&amp;quot;federated&amp;quot; \\\r\n  --federated-catalog-type=&amp;quot;unity&amp;quot; \\\r\n  --unity-instance-name=&amp;quot;dbc-xxxxxxxx-xxxx.cloud.databricks.com&amp;quot; \\\r\n  --unity-catalog-name=&amp;quot;dbx_retail_db&amp;quot; \\\r\n  --unity-service-principal-application-id=&amp;quot;6ea7b861-c5a5-xxxx-xxxx-xxxxxxxxxxxx&amp;quot; \\\r\n  --refresh-interval=&amp;quot;300s&amp;quot;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8a8b4e250&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Once created, describe the catalog to view its assigned service account:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;gcloud alpha biglake iceberg catalogs describe dbx_retail_db \\\r\n  --project=&amp;quot;$GCP_PROJECT_ID&amp;quot;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb896d89950&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Return to Databricks to assign permissions to your service principal:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;-- Grant catalog traversal permission\r\nGRANT USE CATALOG ON CATALOG dbx_retail_db \r\n  TO `6ea7b861-c5a5-xxxx-xxxx-xxxxxxxxxxxx`;\r\n\r\n-- Grant schema and read permissions\r\nGRANT USE SCHEMA,EXTERNAL USE SCHEMA, SELECT ON SCHEMA dbx_retail_db.dbx_core \r\n  TO `6ea7b861-c5a5-xxxx-xxxx-xxxxxxxxxxxx`;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb896d890d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;You must grant the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;EXTERNAL USE SCHEMA&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; privilege to the Databricks Service Principal on the target schemas or catalog to enable credential vending for external data access.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Finally, to complete the connection, configure the federation policy on the Databricks service principal with the following details - &lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Issuer URL* -  &lt;/span&gt;&lt;a href="https://accounts.google.com" rel="noopener" target="_blank"&gt;&lt;span style="vertical-align: baseline;"&gt;https://accounts.google.com&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Subject* -  numeric subject ID returned by the catalog describe command eg 1124251400450xxxxxxxx&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Audiences - https://accounts.cloud.databricks.com&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Run one query across three clouds&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Federated Iceberg tables are addressed in BigQuery using four-part paths: &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;project.catalog.namespace.table&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In our environment, sales transactions reside natively in BigQuery:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;CREATE SCHEMA IF NOT EXISTS local_retail_dataset\r\nOPTIONS(location=&amp;quot;us-central1&amp;quot;);\r\n\r\nCREATE OR REPLACE TABLE `my-lakehouse-project.local_retail_dataset.fact_sales` (\r\n    sale_id STRING,\r\n    sale_date DATE,\r\n    customer_key INT64,\r\n    product_key INT64,\r\n    store_key INT64,\r\n    quantity INT64,\r\n    unit_price NUMERIC,\r\n    discount NUMERIC,\r\n    total_revenue NUMERIC,\r\n    total_cost NUMERIC,\r\n    margin NUMERIC\r\n)\r\nPARTITION BY sale_date\r\nCLUSTER BY store_key, product_key;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8a8a9d290&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;We can now run a single SQL query joining our native sales transactions with customer records in Snowflake, product lines in Databricks, and store locations in AWS Glue:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;SELECT \r\n    c.first_name || &amp;#x27; &amp;#x27; || c.last_name AS customer_name, -- From Snowflake Iceberg\r\n    p.product_name,                                      -- From Databricks Iceberg\r\n    s.store_name,                                        -- From AWS S3 Iceberg\r\n    SUM(f.quantity) AS total_units_sold,                 -- From BigQuery native fact\r\n    SUM(f.total_revenue) AS total_sales_revenue          -- From BigQuery native fact\r\nFROM `my-lakehouse-project.local_retail_dataset.fact_sales` f\r\nINNER JOIN `my-lakehouse-project.sf_retail_db.CORE.DIM_CUSTOMERS` c \r\n  ON f.customer_key = c.customer_key\r\nINNER JOIN `my-lakehouse-project.dbx_retail_db.dbx_core.dim_products` p \r\n  ON f.product_key = p.product_key\r\nINNER JOIN `my-lakehouse-project.glue_retail_db.glue_retail_db.dim_stores` s \r\n  ON f.store_key = s.store_key\r\nGROUP BY 1, 2, 3\r\nORDER BY total_sales_revenue DESC\r\nLIMIT 10;&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb896ae0610&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;BigQuery processes the joins in place. Notice that Snowflake identifiers appear in uppercase (&lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;CORE.DIM_CUSTOMERS&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;), while Databricks and AWS Glue maintain lowercase table paths.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/2_rJTiq5W.max-1000x1000.png"
        
          alt="2"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="bhx8b"&gt;Figure 2 - Query results combining data across Snowflake, Databricks, and AWS Glue.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Explore cross-cloud data with natural language&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Because federated Iceberg tables behave like native tables within BigQuery, downstream analytical features inherit access directly. You can point conversational analytics in BigQuery at these federated schemas to let team members explore cross-cloud data using natural language prompts.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To give conversational analytics full operational context, we save our federated join as a logical view:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;CREATE OR REPLACE VIEW `my-lakehouse-project.local_retail_dataset.v_omnichannel_sales_pulse` AS\r\nSELECT \r\n    f.sale_id,\r\n    f.sale_date,\r\n    c.first_name || &amp;#x27; &amp;#x27; || c.last_name AS customer_name,\r\n    c.country AS customer_country,\r\n    p.product_name,\r\n    p.category AS product_category,\r\n    p.brand AS product_brand,\r\n    s.store_name,\r\n    s.city AS store_city,\r\n    s.region AS store_region,\r\n    f.quantity,\r\n    f.total_revenue,\r\n    f.margin\r\nFROM `my-lakehouse-project.local_retail_dataset.fact_sales` f\r\nINNER JOIN `my-lakehouse-project.sf_retail_db.CORE.DIM_CUSTOMERS` c \r\n  ON f.customer_key = c.customer_key\r\nINNER JOIN `my-lakehouse-project.dbx_retail_db.dbx_core.dim_products` p \r\n  ON f.product_key = p.product_key\r\nINNER JOIN `my-lakehouse-project.glue_retail_db.glue_retail_db.dim_stores` s \r\n  ON f.store_key = s.store_key;&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb896ae0c90&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;Analyze sales performance in natural language&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;When you ask conversational analytics in BigQuery:&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 40px;"&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;"Who are our top customers by total sales revenue, what products did they buy, and which stores did they shop at?"&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Conversational analytics evaluates the schema across all three remote catalogs, generates the SQL statement, executes the query, and presents the response. &lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/3_7V8coFu.max-1000x1000.png"
        
          alt="3"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="bhx8b"&gt;Figure 3: Conversational analytics in BigQuery translates plain-language prompts into federated queries across Snowflake, Databricks, and AWS Glue.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Plan for caching and data residency&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Before deploying federated catalogs in production, consider these operational behaviors:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Background refresh timing:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; The &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;--refresh-interval&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; flag controls metadata synchronization. The minimum interval is 300 seconds. For larger catalogs containing hundreds of tables, metadata retrieval can take longer. If a sync cycle overruns, BigQuery skips the next scheduled run to avoid task queuing.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Automatic query caching:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; BigQuery caches retrieved cross-cloud data blocks in the region where your federated catalog resides (e.g. &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;us-central1&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;). This helps reduce network transfer on repeated queries. Because cached blocks reside within Google Cloud storage in that region, confirm that this aligns with your organization's data residency policies.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Encryption controls:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Cross-cloud cache blocks use Google-managed encryption keys. If your organization enforces the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;constraints/gcp.restrictNonCmekServices&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; policy constraint, BigQuery bypasses the cache and reads directly from remote storage for every query.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Monitoring access metrics:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; You can evaluate cache utilization in your query execution plans. Check the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;objectStorageStats&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; section in BigQuery job statistics to compare &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;cacheBytesRead&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; against &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;objectStorageBytesRead&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Next steps&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In summary, Google Cloud’s borderless Lakehouse helps you activate your data regardless of where it lives without costly migrations or building additional data pipelines.   Get started today by reviewing the&lt;/span&gt;&lt;a href="https://docs.cloud.google.com/lakehouse/docs/about-cross-cloud-data-access"&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;borderless Lakehouse architecture documentation&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to learn more about supported regions and credential configurations. You can work through the&lt;/span&gt;&lt;a href="https://docs.cloud.google.com/lakehouse/docs/cross-cloud-data-access-codelab"&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;borderless Lakehouse codelab&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to practice federating external catalogs step-by-step. Finally, connect with your Google Cloud account team or customer engineer to evaluate borderless lakehouse patterns for your specific data platforms or industries.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;hr/&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Appendix&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Setting up Snowflake and AWS Glue cross cloud data access&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Connect Snowflake and Big Query&lt;/span&gt;&lt;/h3&gt;
&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;Configure Snowflake Horizon Catalog&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;We begin in Snowflake by creating the database, schema, and Iceberg table. In Snowflake Horizon, managed Iceberg tables expose an open Apache Iceberg REST catalog interface automatically:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;-- Run inside Snowflake SQL worksheet\r\nCREATE DATABASE IF NOT EXISTS sf_retail_db;\r\nCREATE SCHEMA IF NOT EXISTS sf_retail_db.core;\r\n\r\n-- Create the Iceberg dimension table\r\nCREATE OR REPLACE ICEBERG TABLE sf_retail_db.core.dim_customers (\r\n    customer_key INTEGER,\r\n    customer_id VARCHAR,\r\n    first_name VARCHAR,\r\n    last_name VARCHAR,\r\n    email VARCHAR,\r\n    gender VARCHAR,\r\n    country VARCHAR,\r\n    signup_date DATE\r\n\r\n)\r\nCATALOG = &amp;#x27;SNOWFLAKE&amp;#x27;\r\nEXTERNAL_VOLUME = &amp;#x27;SNOWFLAKE_MANAGED&amp;#x27;;&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb896ae2810&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Before external engines can read this catalog, configure a dedicated reader role and grant traversal permissions across the database, schema, and table. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;SQL&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;-- Create a dedicated reader role\r\nCREATE ROLE IF NOT EXISTS gcp_lakehouse_reader_role;\r\n\r\n-- Grant database and schema traversal permissions\r\nGRANT USAGE ON DATABASE sf_retail_db TO ROLE gcp_lakehouse_reader_role;\r\nGRANT USAGE ON SCHEMA sf_retail_db.core TO ROLE gcp_lakehouse_reader_role;\r\n\r\n-- Grant read access on the target table\r\nGRANT SELECT ON TABLE sf_retail_db.core.dim_customers TO ROLE gcp_lakehouse_reader_role;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb896ff1ad0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Next, create the federated catalog inside Google Cloud using the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;gcloud&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; command-line tool. You will need your Snowflake account identifier, the reader role, and the root Iceberg database name:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;bash&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;export GCP_PROJECT_ID=&amp;quot;my-lakehouse-project&amp;quot;\r\nexport GCP_REGION=&amp;quot;us-central1&amp;quot;\r\n\r\ngcloud alpha biglake iceberg catalogs create sf_retail_db \\\r\n  --project=&amp;quot;$GCP_PROJECT_ID&amp;quot; \\\r\n  --primary-location=&amp;quot;$GCP_REGION&amp;quot; \\\r\n  --catalog-type=&amp;quot;federated&amp;quot; \\\r\n  --federated-catalog-type=&amp;quot;snowflake&amp;quot; \\\r\n  --snowflake-account-identifier=&amp;quot;xy12345-ab67890&amp;quot; \\\r\n  --snowflake-warehouse=&amp;quot;SF_RETAIL_DB&amp;quot; \\\r\n  --snowflake-role=&amp;quot;gcp_lakehouse_reader_role&amp;quot; \\\r\n  --refresh-interval=&amp;quot;300s&amp;quot;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8a8a9d790&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In the Apache Iceberg REST specification, &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;--snowflake-warehouse&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; references the catalog root database name (&lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;SF_RETAIL_DB&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;), not a virtual compute warehouse.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Once created, describe the catalog to view its assigned numeric service account ID:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;bash&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;gcloud alpha biglake iceberg catalogs describe sf_retail_db \\\r\n  --project=&amp;quot;$GCP_PROJECT_ID&amp;quot; \\\r\n  --format=\&amp;#x27;value(biglake-service-account-id)\&amp;#x27;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb896ff3c50&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Return to Snowflake to bind Google Cloud's numeric identity to a passwordless service user via Workload Identity Federation (WIF):&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;SQL&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;-- Run inside Snowflake SQL worksheet\r\nUSE ROLE ACCOUNTADMIN;\r\n\r\n-- Bind Google Cloud&amp;#x27;s numeric identity to a passwordless service user\r\nCREATE OR REPLACE USER snowflake_service_user\r\n  TYPE = SERVICE\r\n  WORKLOAD_IDENTITY = (\r\n    TYPE = GCP\r\n    SUBJECT = &amp;#x27;102669xxxxxxxxxxxxxxxxx&amp;#x27; -- Numeric subject ID returned by gcloud describe\r\n  )\r\n  DEFAULT_ROLE = gcp_lakehouse_reader_role\r\n  COMMENT = &amp;#x27;Service user for Lakehouse catalog federation over WIF&amp;#x27;;\r\n\r\n-- Grant the reader role to this service user\r\nGRANT ROLE gcp_lakehouse_reader_role TO USER snowflake_service_user;&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb896ff3a10&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This establishes passwordless authentication over OpenID Connect, allowing BigQuery to discover table metadata and vend temporary query-time credentials directly from Snowflake Horizon.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Configure AWS Glue Data Catalog&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;We begin in AWS by preparing the IAM identity, establishing access permissions across AWS Glue and Amazon S3, and registering the Iceberg table.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;First, create a placeholder trust policy named &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;trust_policy.json&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;. This allows you to provision the AWS IAM role before Google Cloud assigns the unique catalog service agent:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;{\r\n  &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,\r\n  &amp;quot;Statement&amp;quot;: [\r\n    {\r\n      &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,\r\n      &amp;quot;Principal&amp;quot;: {\r\n        &amp;quot;Federated&amp;quot;: &amp;quot;accounts.google.com&amp;quot;\r\n      },\r\n      &amp;quot;Action&amp;quot;: &amp;quot;sts:AssumeRoleWithWebIdentity&amp;quot;,\r\n      &amp;quot;Condition&amp;quot;: {\r\n        &amp;quot;StringEquals&amp;quot;: {\r\n          &amp;quot;accounts.google.com:aud&amp;quot;: [&amp;quot;PLACEHOLDER_VALUE&amp;quot;],\r\n          &amp;quot;accounts.google.com:sub&amp;quot;: [&amp;quot;PLACEHOLDER_VALUE&amp;quot;]\r\n        }\r\n      }\r\n    }\r\n  ]\r\n}&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb896ff3210&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Create the IAM role using the AWS CLI. Setting a 12-hour session duration (&lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;43200&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; seconds) prevents credential expiration during long-running analytical queries:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;export AWS_ROLE_NAME=&amp;quot;lakehouse_glue_federation_role&amp;quot;\r\n\r\naws iam create-role \\\r\n  --role-name &amp;quot;$AWS_ROLE_NAME&amp;quot; \\\r\n  --assume-role-policy-document file://trust_policy.json \\\r\n  --max-session-duration 43200&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb896ff3e10&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Next, define the permissions policy in a file named &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;permissions_policy.json&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;. This policy grants BigQuery permission to read the AWS Glue catalog metadata and access the underlying Parquet data files in Amazon S3:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;{\r\n  &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,\r\n  &amp;quot;Statement&amp;quot;: [\r\n    {\r\n      &amp;quot;Sid&amp;quot;: &amp;quot;GlueCatalogRead&amp;quot;,\r\n      &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,\r\n      &amp;quot;Action&amp;quot;: [\r\n        &amp;quot;glue:GetCatalog&amp;quot;,\r\n        &amp;quot;glue:GetDatabase&amp;quot;,\r\n        &amp;quot;glue:GetDatabases&amp;quot;,\r\n        &amp;quot;glue:GetTable&amp;quot;,\r\n        &amp;quot;glue:GetTables&amp;quot;\r\n      ],\r\n      &amp;quot;Resource&amp;quot;: &amp;quot;arn:aws:glue:us-east-2:123456789012:*&amp;quot;\r\n    },\r\n    {\r\n      &amp;quot;Sid&amp;quot;: &amp;quot;S3BucketAndObjectRead&amp;quot;,\r\n      &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,\r\n      &amp;quot;Action&amp;quot;: [\r\n        &amp;quot;s3:ListBucket&amp;quot;,\r\n        &amp;quot;s3:GetObject&amp;quot;\r\n      ],\r\n      &amp;quot;Resource&amp;quot;: [\r\n        &amp;quot;arn:aws:s3:::my-glue-iceberg-bucket&amp;quot;,\r\n        &amp;quot;arn:aws:s3:::my-glue-iceberg-bucket/*&amp;quot;\r\n      ]\r\n    }\r\n  ]\r\n}&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb896ff1e50&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Attach this permissions policy to your newly created role:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;aws iam put-role-policy \\\r\n  --role-name &amp;quot;$AWS_ROLE_NAME&amp;quot; \\\r\n  --policy-name &amp;quot;lakehouse_glue_federation_policy&amp;quot; \\\r\n  --policy-document file://permissions_policy.json&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb896ff1650&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Important (AWS Lake Formation):&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; If your AWS environment uses AWS Lake Formation, verify that the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;IAMAllowedPrincipals&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; group has access to the target database and table (or grant explicit Lake Formation permissions to &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;lakehouse_glue_federation_role if the bucket is registered with AWS Lake Formation&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;). Without this, Lake Formation security settings will block the IAM role from accessing catalog metadata.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;With permissions in place, create the database and Iceberg table in AWS Glue using Amazon Athena:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;-- Run inside Amazon Athena\r\nCREATE DATABASE IF NOT EXISTS glue_retail_db;\r\n\r\nCREATE TABLE IF NOT EXISTS glue_retail_db.dim_stores (\r\n    store_key INT,\r\n    store_id STRING,\r\n    store_name STRING,\r\n    city STRING,\r\n    state STRING,\r\n    region STRING,\r\n    manager STRING,\r\n    opened_date DATE\r\n\r\n)\r\nLOCATION &amp;#x27;s3://my-glue-iceberg-bucket/retail/dim_stores/&amp;#x27;\r\nTBLPROPERTIES (\r\n    &amp;#x27;table_type&amp;#x27;=&amp;#x27;ICEBERG&amp;#x27;,        \r\n    &amp;#x27;format&amp;#x27;=&amp;#x27;parquet&amp;#x27;,           \r\n    &amp;#x27;write_compression&amp;#x27;=&amp;#x27;zstd&amp;#x27; \r\n\r\n);&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8971b0b90&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Connect AWS Glue to BigQuery&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Next, register the federated catalog inside Google Cloud using the &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;gcloud&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; command-line tool. You will need your 12-digit AWS Account ID, AWS Region, and the role ARN created above:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;export GCP_PROJECT_ID=&amp;quot;my-lakehouse-project&amp;quot;\r\nexport GCP_REGION=&amp;quot;us-central1&amp;quot;\r\nexport AWS_REGION=&amp;quot;us-east-2&amp;quot;\r\nexport AWS_ACCOUNT_ID=&amp;quot;123456789012&amp;quot;\r\n\r\ngcloud alpha biglake iceberg catalogs create glue_retail_db \\\r\n  --project=&amp;quot;$GCP_PROJECT_ID&amp;quot; \\\r\n  --primary-location=&amp;quot;$GCP_REGION&amp;quot; \\\r\n  --catalog-type=&amp;quot;federated&amp;quot; \\\r\n  --federated-catalog-type=&amp;quot;glue&amp;quot; \\\r\n  --glue-warehouse=&amp;quot;$AWS_ACCOUNT_ID&amp;quot; \\\r\n  --glue-aws-region=&amp;quot;$AWS_REGION&amp;quot; \\\r\n  --glue-aws-role-arn=&amp;quot;arn:aws:iam::${AWS_ACCOUNT_ID}:role/lakehouse_glue_federation_role&amp;quot;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb897e27390&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To prevent premature background refresh failures while the AWS trust policy propagates, initialize the catalog without setting a refresh schedule.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Next, extract the unique numeric subject ID assigned to the catalog by Google Cloud:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;export LAKEHOUSE_SA_ID=$(gcloud alpha biglake iceberg catalogs describe glue_retail_db \\\r\n  --project=&amp;quot;$GCP_PROJECT_ID&amp;quot; \\\r\n  --format=&amp;quot;value(biglake-service-account-id)&amp;quot;)\r\n\r\necho &amp;quot;Assigned Lakehouse Service Account ID: $LAKEHOUSE_SA_ID&amp;quot;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb897e26ed0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Return to the AWS CLI and update your IAM role's trust policy, replacing the placeholder with the verified Google Cloud identity:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;cat &amp;gt; trust_policy_final.json &amp;lt;&amp;lt; EOF\r\n{\r\n  &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,\r\n  &amp;quot;Statement&amp;quot;: [\r\n    {\r\n      &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,\r\n      &amp;quot;Principal&amp;quot;: {\r\n        &amp;quot;Federated&amp;quot;: &amp;quot;accounts.google.com&amp;quot;\r\n      },\r\n      &amp;quot;Action&amp;quot;: &amp;quot;sts:AssumeRoleWithWebIdentity&amp;quot;,\r\n      &amp;quot;Condition&amp;quot;: {\r\n        &amp;quot;StringEquals&amp;quot;: {\r\n          &amp;quot;accounts.google.com:aud&amp;quot;: [\r\n            &amp;quot;$LAKEHOUSE_SA_ID&amp;quot;\r\n          ],\r\n          &amp;quot;accounts.google.com:sub&amp;quot;: [\r\n            &amp;quot;$LAKEHOUSE_SA_ID&amp;quot;\r\n          ]\r\n        }\r\n      }\r\n    }\r\n  ]\r\n}\r\nEOF\r\n\r\naws iam update-assume-role-policy \\\r\n  --role-name &amp;quot;$AWS_ROLE_NAME&amp;quot; \\\r\n  --policy-document file://trust_policy_final.json&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8968f6f50&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;5. Enable metadata synchronization and verify&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;bash&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;gcloud alpha biglake iceberg catalogs update glue_retail_db \\\r\n  --project=&amp;quot;$GCP_PROJECT_ID&amp;quot; \\\r\n  --refresh-interval=&amp;quot;300s&amp;quot;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8968f7e50&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Verify that the namespaces are discovered and synchronized:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;bash&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;# Verify namespaces synchronized from AWS Glue\r\ngcloud alpha biglake iceberg namespaces list \\\r\n  --project=&amp;quot;$GCP_PROJECT_ID&amp;quot; \\\r\n  --catalog=&amp;quot;glue_retail_db&amp;quot;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8968f51d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;</description><pubDate>Tue, 13 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/data-analytics/cross-cloud-conversational-analytics-with-borderless-lakehouse/</guid><category>Data Analytics</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Cross-cloud conversational analytics made simple with open standards</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/data-analytics/cross-cloud-conversational-analytics-with-borderless-lakehouse/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Praveen Kumar</name><title>Customer Engineer, Data &amp; AI</title><department></department><company></company></author></item><item><title>Introducing TimesFM 3.0 with multivariate time-series forecasting in BigQuery</title><link>https://cloud.google.com/blog/products/data-analytics/bigquery-timesfm-3-0-with-multivariate-time-series-forecasting/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Overview&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Since introducing zero-shot time-series forecasting in BigQuery with &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-ai-forecast"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;AI.FORECAST&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; — initially powered by TimesFM 2.0 and later upgraded to TimesFM 2.5 — you have been able to generate forecasts directly in SQL without training or managing custom models. However, up until TimesFM 2.5, these foundation models were limited to univariate forecasting, predicting future values from the history of a single time series alone. In practice, most real-world forecasting problems are multivariate, where related targets and external drivers like weather, promotions, and holidays jointly shape future outcomes.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Today, we are thrilled to announce the preview of TimesFM 3.0 in BigQuery. Developed by Google Research, &lt;/span&gt;&lt;a href="https://research.google/blog/timesfm-3-a-zero-shot-foundation-model-for-multivariate-forecasting" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;TimesFM 3.0&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; is a 330-million parameter state-of-the-art foundation model designed to unlock native multivariate time-series forecasting directly inside BigQuery SQL. TimesFM 3.0 ranks #1 across all three major public time-series leaderboards — GIFT-Eval, FEV-Bench, and TIME — achieving top zero-shot accuracy on both covariate and multivariate forecasting tasks compared to existing foundation models.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Alongside its new multivariate capabilities, TimesFM 3.0 also serves as a drop-in upgrade for univariate forecasting via AI.FORECAST and anomaly detection via &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-ai-detect-anomalies"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;AI.DETECT_ANOMALIES&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. Existing workflows can immediately benefit from higher benchmark accuracy simply by specifying &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;model =&amp;gt; 'TimesFM 3.0'&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;What’s new: Multivariate foundation modeling&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;With TimesFM 3.0, BigQuery brings enterprise-grade multivariate modeling into familiar SQL workflows via AI.FORECAST:&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div align="center"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;&lt;table style="width: 99.6084%;"&gt;&lt;colgroup&gt;&lt;col style="width: 42.5269%;"/&gt;&lt;col style="width: 27.8143%;"/&gt;&lt;col style="width: 29.6588%;"/&gt;&lt;/colgroup&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Capability&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;TimesFM 2.0 / 2.5&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;TimesFM 3.0&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Forecasting scope&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Univariate only&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Univariate and multivariate&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Target columns&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Single target&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Single or multiple targets&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Covariate columns with past-only values&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Not supported&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Supported&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Covariate columns with past and future values&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Not supported&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Supported&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;Multivariate forecasting with BigQuery SQL&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To see how these capabilities work together, let’s forecast daily commuter (subscriber_trips) and leisure (casual_trips) bike rides over a seven-day horizon using the NYC Citi Bike public dataset (&lt;/span&gt;&lt;a href="https://console.cloud.google.com/bigquery?ws=!1m5!1m4!4m3!1sbigquery-public-data!2snew_york!3scitibike_trips"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;bigquery-public-data.new_york.citibike_trips&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;BigQuery uses a single-table input format for multivariate forecasting that combines two sets of rows:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Historical observation rows&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: timestamps between start time (2016-01-01) and the forecast cutoff date (2016-06-01), fully populated with target metrics, past covariates, and known future covariates&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Future horizon rows&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: timestamps across the seven-day forecast horizon (2016-06-01 to 2016-06-07) populated with known future covariates, while target columns and past-only covariates are set to NULL&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;WITH data AS (\r\n  SELECT\r\n    DATE(starttime) AS date,\r\n    IF(MIN(starttime) &amp;lt; &amp;#x27;2016-06-01&amp;#x27;, COUNTIF(usertype = &amp;#x27;Subscriber&amp;#x27;), NULL) AS subscriber_trips,\r\n    IF(MIN(starttime) &amp;lt; &amp;#x27;2016-06-01&amp;#x27;, COUNTIF(usertype = &amp;#x27;Customer&amp;#x27;), NULL) AS casual_trips,\r\n    IF(MIN(starttime) &amp;lt; &amp;#x27;2016-06-01&amp;#x27;, AVG(tripduration / 60.0), NULL) AS avg_duration_min,\r\n    IF(EXTRACT(DAYOFWEEK FROM MIN(starttime)) IN (1, 7), 1.0, 0.0) AS is_weekend\r\n  FROM `bigquery-public-data.new_york.citibike_trips`\r\n  WHERE starttime &amp;gt;= &amp;#x27;2016-01-01&amp;#x27; AND starttime &amp;lt; &amp;#x27;2016-06-08&amp;#x27;\r\n  GROUP BY date\r\n)\r\nSELECT\r\n  *\r\nFROM\r\n  AI.FORECAST(\r\n    TABLE data,\r\n    MODEL =&amp;gt; &amp;#x27;TimesFM 3.0&amp;#x27;,\r\n    TIMESTAMP_COL =&amp;gt; &amp;#x27;date&amp;#x27;,\r\n    TARGET_COLS =&amp;gt; [&amp;#x27;subscriber_trips&amp;#x27;, &amp;#x27;casual_trips&amp;#x27;],\r\n    PAST_COVARIATE_COLS =&amp;gt; [&amp;#x27;avg_duration_min&amp;#x27;],\r\n    FUTURE_COVARIATE_COLS =&amp;gt; [&amp;#x27;is_weekend&amp;#x27;]\r\n  );&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;lang-sql&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb896d162d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This query highlights the three multivariate dimensions supported in TimesFM 3.0:&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Forecasting correlated targets (&lt;/strong&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-ai-forecast#multivariate"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;target_cols&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt;)&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Instead of running separate models for each rider segment, passing TARGET_COLS =&amp;gt; ['subscriber_trips', 'casual_trips'] forecasts both metrics jointly in a single call. TimesFM 3.0 captures the cross-series dynamics between commuter and casual riders — such as shared weather sensitivity and diverging weekend ridership patterns.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Using past covariates (&lt;/strong&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-ai-forecast#multivariate"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;past_covariate_cols&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt;)&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Some signals can only be observed historically and are not known in advance, such as average ride duration (avg_duration_min), historical foot traffic, or unplanned service disruptions. Passing PAST_COVARIATE_COLS =&amp;gt; ['avg_duration_min'] (with future horizon rows set to NULL) gives the model historical context to distinguish temporary shocks from underlying trends without requiring future values for that feature.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Using future covariates (&lt;/strong&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-ai-forecast#multivariate"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;future_covariate_cols&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt;)&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Other external drivers are known ahead of time across both the historical window and the forecast horizon — such as weekends (is_weekend), holidays, or scheduled promotions. Passing FUTURE_COVARIATE_COLS =&amp;gt; ['is_weekend'] (populated across all rows through 2016-06-07) allows TimesFM 3.0 to condition its seven-day predictions directly on upcoming calendar events.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;Understanding the output&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The function returns structured predictions for each target column specified in &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;target_cols&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;. For each column in target_cols, AI.FORECAST returns a struct containing the point forecast (value) and the lower and upper prediction interval bounds:&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div align="center"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;&lt;table style="width: 275.979%;"&gt;&lt;colgroup&gt;&lt;col style="width: 14.4322%;"/&gt;&lt;col style="width: 1.23269%;"/&gt;&lt;col style="width: 12.0681%;"/&gt;&lt;col style="width: 12.0681%;"/&gt;&lt;col style="width: 8.23474%;"/&gt;&lt;col style="width: 10.5537%;"/&gt;&lt;col style="width: 10.6484%;"/&gt;&lt;col style="width: 8.32939%;"/&gt;&lt;col style="width: 7.8088%;"/&gt;&lt;col style="width: 14.6238%;"/&gt;&lt;/colgroup&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;date&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;subscriber_&lt;br/&gt;trips.value&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;subscriber_trips.prediction_&lt;br/&gt;interval_lower_bound&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;subscriber_trips.prediction_&lt;br/&gt;interval_upper_bound&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;casual_trips.value&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;casual_trips.prediction_&lt;br/&gt;interval_lower_bound&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;casual_trips.prediction_&lt;br/&gt;interval_upper_bound&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;time_series_type&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;confidence_level&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;ai_forecast_status&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;2016-06-01 00:00:00 UTC&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;44699.64&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;32590.76&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;55723.44&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;4581.32&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;1727.91&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;9189.31&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;forecast&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;0.95&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;2016-06-02 00:00:00 UTC&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;44611.75&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;30413.05&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;57209.19&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;4647.17&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;1466.23&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;10273.55&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;forecast&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;0.95&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;2016-06-03 00:00:00 UTC&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;41379.15&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;26218.65&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;54940.09&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;5341.36&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;1568.23&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;11805.86&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;forecast&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;0.95&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;2016-06-04 00:00:00 UTC&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;30164.34&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;14266.43&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;45075.92&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;9097.74&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;2558.27&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;18452.52&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;forecast&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;0.95&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;2016-06-05 00:00:00 UTC&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;26727.27&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;10101.44&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;42239.33&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;8398.50&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;1692.15&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;17768.99&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;forecast&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;0.95&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;2016-06-06 00:00:00 UTC&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;36713.84&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;19493.00&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;52679.59&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;4723.08&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;400.08&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;11710.73&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;forecast&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;0.95&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;2016-06-07 00:00:00 UTC&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;39749.97&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;22157.42&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;56119.86&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;4180.97&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;95.70&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;10845.74&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;forecast&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;0.95&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: top; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;TimesFM 3.0 in BigQuery Conversational Analytics&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;You can also run multivariate forecasts using natural language in BigQuery Conversational Analytics. On the same &lt;/span&gt;&lt;a href="https://console.cloud.google.com/bigquery?ws=!1m5!1m4!4m3!1sbigquery-public-data!2snew_york!3scitibike_trips"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;bigquery-public-data.new_york.citibike_trips&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; dataset, you can simply ask "Forecast both daily subscriber and casual trips for June 1–7, 2016 using two month historical data, with average trip duration as a past covariate and weekend indicator as a future covariate." Conversational Analytics automatically generates and executes the underlying AI.FORECAST query with TimesFM 3.0, returning a summary of the results, interactive forecast charts with prediction intervals for each target, and key forecast insights.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/timesfm_3_in_ca_2.gif"
        
          alt="timesfm_3_in_ca_2"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="c4y6q"&gt;Multivariate forecasting with TimesFM 3.0 in BigQuery Conversational Analytics, generating 7-day predictions, interactive charts, and insights from a natural-language prompt.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Summary and next steps&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;With native multivariate support in TimesFM 3.0, BigQuery brings state-of-the-art foundation model forecasting to complex, interconnected enterprise datasets without requiring data movement, custom feature engineering pipelines, or dedicated model hosting infrastructure.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To start forecasting with TimesFM 3.0 in BigQuery:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Read the Google Research &lt;/span&gt;&lt;a href="https://research.google/blog/timesfm-3-a-zero-shot-foundation-model-for-multivariate-forecasting" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;blog post&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to learn more about the TimesFM 3.0 model architecture and capabilities.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Explore the BigQuery &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/timesfm-model"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;TimesFM&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; documentation.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Follow the step-by-step multivariate forecasting &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/timesfm-multivariate-multi-time-series-forecasting-tutorial"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;tutorial&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Try &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-ai-forecast"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;AI.FORECAST&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; with `model =&amp;gt; 'TimesFM 3.0'` directly in the BigQuery Studio SQL workspace.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Try &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-ai-detect-anomalies"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;AI.DETECT_ANOMALIES&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; with `model =&amp;gt; 'TimesFM 3.0'` for univariate time series anomaly detection in BigQuery.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Try &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-ai-evaluate"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;AI.EVALUATE&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; with `model =&amp;gt; 'TimesFM 3.0'` for univariate time series evaluation in BigQuery.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><pubDate>Mon, 12 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/data-analytics/bigquery-timesfm-3-0-with-multivariate-time-series-forecasting/</guid><category>BigQuery</category><category>Data Analytics</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Introducing TimesFM 3.0 with multivariate time-series forecasting in BigQuery</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/data-analytics/bigquery-timesfm-3-0-with-multivariate-time-series-forecasting/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Haiyang Qi</name><title>Software Engineer</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Haoming Chen</name><title>Engineering Manager</title><department></department><company></company></author></item><item><title>Agentic data science with the Data Agent Kit</title><link>https://cloud.google.com/blog/products/data-analytics/bringing-you-the-data-agent-kit/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Imagine your compliance team notices that payments are taking longer than expected to clear. They suspect fraud, and you’re the data scientist helping figure out which transactions to investigate first. Assembling that shortlist requires ingesting and cleaning raw transaction logs, training a model on past fraud, scoring new records, and scheduling the pipeline to run daily. Here’s how you can build that workflow end to end with an agent, using the Data Agent Kit inside the Antigravity IDE.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Introducing the Data Agent Kit&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://cloud.google.com/products/data-agent-kit?utm_campaign=CDR_0xaea1deef_default_b563520811&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Data Agent Kit&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; helps you work with Google Cloud data through a &lt;/span&gt;&lt;a href="https://github.com/GoogleCloudPlatform/data-agent-kit-plugin" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;plugin for coding agents&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; or an &lt;/span&gt;&lt;a href="https://open-vsx.org/extension/googlecloudtools/datacloud" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;extension for Visual Studio Code-based IDEs&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. It brings two significant additions to the workflow:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Help for your agent: &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;MCP tools connect your agent to data services. Skills are Markdown files that give it instructions and best practices for working with your data stack&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Tools in your IDE: &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;work with Google’s &lt;/span&gt;&lt;a href="https://cloud.google.com/data-cloud?utm_campaign=CDR_0xaea1deef_default_b563520811&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Agentic Data Cloud&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, from querying databases to deploying an Airflow pipeline, without leaving your editor&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Loading the data&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Let’s start with the raw transaction logs in &lt;/span&gt;&lt;a href="https://cloud.google.com/storage?utm_campaign=CDR_0xaea1deef_default_b563520811&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Cloud Storage&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. You can ask the agent to create a notebook that loads them into &lt;/span&gt;&lt;a href="https://cloud.google.com/bigquery?utm_campaign=CDR_0xaea1deef_default_b563520811&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;BigQuery&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; using &lt;/span&gt;&lt;a href="https://cloud.google.com/products/managed-service-for-apache-spark?utm_campaign=CDR_0xaea1deef_default_b563520811&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Spark&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;Create a PySpark notebook to ingest JSON transaction logs from gs://financials-clearing-raw/ into the BigQuery table transactions.raw_transactions.&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8a8db8a50&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The agent generates a Jupyter notebook that loads the JSON logs into a BigQuery table named &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;raw_transactions&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;. You can open the notebook, review the code, and run it using a preconfigured Spark Serverless runtime from the IDE.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/1_spark_runtime.gif"
        
          alt="1_spark_runtime"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="nhsv8"&gt;Running a generated PySpark notebook&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;After the notebook runs, you can open the &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;raw_transactions&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; table with the Data Agent Kit. The extension allows you to browse the table and inspect its metadata right from the IDE.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/2_raw_table_ide.max-1000x1000.png"
        
          alt="2_raw_table_ide"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="nhsv8"&gt;Inspecting a BigQuery table in the IDE&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The records are now in BigQuery, but they aren’t ready for model training yet. First, we’ll handle duplicate and incomplete records, then join the remaining records with info about who sent and received each payment.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Cleaning it up&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Let’s put the cleanup logic into a dbt project so we can run it on each new batch of data. We’ll also test that each transaction appears only once. Prompt the agent:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;Create a dbt project in dbt_project/ for the BigQuery dataset transactions.\r\n\r\nDeduplicate raw_transactions by transaction_id in staging. Separate records with null IDs into invalid_transactions. Join valid records with dim_payers and dim_payees to create enriched_transactions, preserving the is_fraud label. Add a transaction uniqueness test.&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8a8dba8d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The agent generates a dbt project with SQL models for cleaning and enriching the data. Take a look at the generated code to check how it handles duplicates and joins reference tables. Then run &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;dbt build&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; in the terminal. This builds the staging and enriched tables in BigQuery, along with a separate table for records with missing transaction IDs. dbt also runs the uniqueness test.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/3_dbt_build.max-1000x1000.png"
        
          alt="3_dbt_build"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="nhsv8"&gt;Validating dbt models in the integrated terminal&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;We also keep the &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;is_fraud&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; column, which indicates whether a past transaction was fraudulent. We’ll train the model on records with known labels and use it to score new transactions, where we’re unsure yet whether fraud occurred.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Building the review queue&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;With the data prepared, let’s ask the agent to create a training notebook using a Random Forest classifier running on Spark Serverless. &lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;Create a PySpark notebook to train a RandomForestClassifier\r\non table transactions.enriched_transactions.\r\n\r\nPredict is_fraud, training only on records where the label\r\nis not null. Encode categorical features, scale amounts,\r\nand evaluate the model using ROC AUC. Save the evaluated model to gs://models/fraud_model.&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8a8db9590&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Review and run the notebook, then check its evaluation output to see how well the model separates fraudulent transactions from legitimate ones. You can also use the Data Agent Kit extension to verify that the trained model artifacts were saved to Google Cloud Storage.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--medium
      
      
        h-c-grid__col
        
        h-c-grid__col--4 h-c-grid__col--offset-4
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/4_trained_model_gcs.max-1000x1000.png"
        
          alt="4_trained_model_gcs"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="nhsv8"&gt;Verifying the trained model artifacts in Google Cloud Storage&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Now we can use the saved model to score transactions that don’t have an &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;is_fraud&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; value yet:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;Create a batch inference notebook that loads the saved model from gs://my_models/fraud_model and scores records in transactions.enriched_transactions where is_fraud is null.\r\n\r\nWrite transactions with a fraud probability score &amp;gt;= 0.50 to the Spanner table SparkEvalFraudReviewQueue, in the instance cymbal-fraud, database fraud-db.&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8a8db8290&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In this example, the inference notebook scores the unlabeled transactions in BigQuery and sends those with an estimated fraud probability of 50% or higher to the &lt;/span&gt;&lt;a href="https://cloud.google.com/spanner?utm_campaign=CDR_0xaea1deef_default_b563520811&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Spanner&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; review queue. The flagged records help the team decide where to investigate, but they still need to determine whether fraud occurred.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Look at how the inference notebook filters and writes flagged records, then run it. Once it finishes, query the Spanner table in the IDE to inspect the results.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/5_spanner_results.max-1000x1000.png"
        
          alt="5_spanner_results"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="nhsv8"&gt;Querying flagged transactions in the Spanner table&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This table is the list we set out to build. The compliance team can now start reviewing transactions, and we have a workflow that gets records from raw logs into the queue.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;So far, we have been kicking off each step ourselves. We can now connect them so the workflow runs automatically each day.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Running it again tomorrow&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Each day we will load the latest logs, apply the dbt transformations, and score unlabeled transactions using the saved model. We’ll use the &lt;/span&gt;&lt;a href="https://cloud.google.com/products/managed-service-for-apache-airflow?utm_campaign=CDR_0xaea1deef_default_b563520811&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Managed Service for Apache Airflow&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to run these steps in order. &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;Ask the agent: &lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;Create an orchestration pipeline named fraud_analysis_pipeline that runs ingestion, the dbt project, and batch inference in that order.\r\n\r\nSchedule it daily at midnight. Use Spark Serverless for the notebooks, including the Spanner connector for inference, and gs://YOUR_ARTIFACT_BUCKET for artifact storage.&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8a8dbaf10&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The agent generates a YAML pipeline definition and deployment configuration. The pipeline definition sets the schedule and dependencies between steps. Meanwhile, the deployment configuration specifies the Airflow environment where it will run.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Data Agent Kit then turns the definition into an Airflow DAG, which you can explore as an interactive graph in the IDE. Open the pipeline under “Orchestration Pipelines” and click a task to inspect it. For notebook tasks, you can follow the link straight back to the code.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/6_pipeline_config.gif"
        
          alt="6_pipeline_config"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="nhsv8"&gt;Inspecting a data pipeline&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;With the Airflow environment configured, click “Run pipeline” in the canvas. Data Agent Kit packages the notebooks and dbt project, deploys the DAG, and triggers a run. Open the pipeline’s execution history to follow its progress. You can also select individual tasks to inspect their status, duration, and logs.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/7_airflow_logs.gif"
        
          alt="7_airflow_logs"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="nhsv8"&gt;Kicking off an Airflow DAG and inspecting the logs&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Airflow will run the pipeline every day, taking new batches of data from raw logs to the review queue. The compliance team can now focus on flagged transactions, and you’ve automated the work of getting those records to them!&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Try it yourself&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;If you are ready to try this for yourself, we have &lt;/span&gt;&lt;a href="https://codelabs.developers.google.com/dak-data-science-antigravity-ide?hl=en#0" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;designed a codelab&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; that walks you through the full setup so you can build and run this workflow. You can also &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/data-agent-kit/overview?utm_campaign=CDR_0xaea1deef_default_b563520811&amp;amp;utm_medium=external&amp;amp;utm_source=blog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;read our documentation&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; or check out the skills and tools in the open-source repository on &lt;/span&gt;&lt;a href="https://github.com/GoogleCloudPlatform/data-agent-kit-plugin" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;GitHub&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-related_article_tout"&gt;





&lt;div class="uni-related-article-tout h-c-page"&gt;
  &lt;section class="h-c-grid"&gt;
    &lt;a href="https://cloud.google.com/blog/products/data-analytics/agentic-analytics-with-the-data-agent-kit/"
       data-analytics='{
                       "event": "page interaction",
                       "category": "article lead",
                       "action": "related article - inline",
                       "label": "article: {slug}"
                     }'
       class="uni-related-article-tout__wrapper h-c-grid__col h-c-grid__col--8 h-c-grid__col-m--6 h-c-grid__col-l--6
        h-c-grid__col--offset-2 h-c-grid__col-m--offset-3 h-c-grid__col-l--offset-3 uni-click-tracker"&gt;
      &lt;div class="uni-related-article-tout__inner-wrapper"&gt;
        &lt;p class="uni-related-article-tout__eyebrow h-c-eyebrow"&gt;Related Article&lt;/p&gt;

        &lt;div class="uni-related-article-tout__content-wrapper"&gt;
          &lt;div class="uni-related-article-tout__image-wrapper"&gt;
            &lt;div class="uni-related-article-tout__image" style="background-image: url('https://storage.googleapis.com/gweb-cloudblog-publish/images/0_hero_image_5no6K6G.max-500x500.png')"&gt;&lt;/div&gt;
          &lt;/div&gt;
          &lt;div class="uni-related-article-tout__content"&gt;
            &lt;h4 class="uni-related-article-tout__header h-has-bottom-margin"&gt;Agentic analytics with the Data Agent Kit&lt;/h4&gt;
            &lt;p class="uni-related-article-tout__body"&gt;Data Agent Kit is a set of MCP servers and agent skills that helps data developers run data workflows from their IDEs. It’s available bot...&lt;/p&gt;
            &lt;div class="cta module-cta h-c-copy  uni-related-article-tout__cta muted"&gt;
              &lt;span class="nowrap"&gt;Read Article
                &lt;svg class="icon h-c-icon" role="presentation"&gt;
                  &lt;use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#mi-arrow-forward"&gt;&lt;/use&gt;
                &lt;/svg&gt;
              &lt;/span&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;/section&gt;
&lt;/div&gt;

&lt;/div&gt;</description><pubDate>Mon, 12 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/data-analytics/bringing-you-the-data-agent-kit/</guid><category>Data Analytics</category><media:content height="540" url="https://storage.googleapis.com/gweb-cloudblog-publish/images/0_banner_image.max-600x600.png" width="540"></media:content><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Agentic data science with the Data Agent Kit</title><description></description><image>https://storage.googleapis.com/gweb-cloudblog-publish/images/0_banner_image.max-600x600.png</image><site_name>Google</site_name><url>https://cloud.google.com/blog/products/data-analytics/bringing-you-the-data-agent-kit/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Jeff Nelson</name><title>Developer Relations Engineer, Google</title><department></department><company></company></author></item><item><title>Trusted Data Apps for the Agentic Data Cloud, powered by Looker</title><link>https://cloud.google.com/blog/products/business-intelligence/introducing-looker-data-apps/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;As a business intelligence user, this probably sounds familiar: Most dashboards only provide you with a standardized canvas and a fixed library of charts, and the “analysis” consists of a CSV export that takes you to another system. Or sometimes it's designing the dashboard that’s the challenge: You can picture the executive briefing, the customer-facing portal, or the interactive explainer that you want, but can’t assemble it out of the available grid tiles.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Either way, the solution has always been to build a custom application. The advent of AI has sped up the process — a working prototype now takes an afternoon — but the excitement of that first demo fades fast. Without access to governed data, row-level security, an infrastructure owner, or a clear path through security review, a tool written by an LLM is simply a prototype that can never go to production.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Today, to bridge this gap, we are announcing &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Looker Data Apps (in preview)&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; — pairing the speed of agent-generated applications with the governance, security, and trust of your existing Looker governance framework. Describe what you need in plain language, and the agent builds it as a real, production-grade application hosted natively inside Looker!&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;What is a data app?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;A data app is a bespoke, interactive web application generated by an AI agent and hosted natively within Looker. While dashboards provide top-down visibility, data apps serve as an active system of action designed around a specific operational workflow. A data app:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Goes beyond standard grid tiles with pixel-perfect, bespoke layouts configured for a specific operational role or job-to-be-done.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Enables business users to input parameters, test scenarios, run live simulations, and update underlying records.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Connects end-to-end business processes by connecting data analysis to business execution tasks like updating source records or dispatching events to tools like Salesforce and Jira.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/1_SS6pcLF.gif"
        
          alt="1"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="cwbsk"&gt;Build pixel-perfect interfaces using AI developer tools like Claude Code or Antigravity CLI, grounded directly by Looker’s semantic layer.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Expanding your semantic layer into an application platform&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Data apps do not replace dashboards; they expand the boundaries of what you can build on top of your existing dashboards and semantic layer.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Dashboards excel at aggregate visibility and passive reporting. Data apps handle active execution, letting users modify parameters and trigger downstream business tasks.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Dashboards provide consistency using standardized chart libraries. Data apps deliver broad flexibility, unlocking custom web components and specialized interactions.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Data apps are grounded in governed data to ensure accuracy. Whether users are reviewing a KPI dashboard or adjusting budgets in a data app, all logic is governed centrally with the LookML semantic layer to eliminate metric discrepancies and hallucinations.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/2_dLheVUo.gif"
        
          alt="2"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="cwbsk"&gt;Transform analysis into action with customizable, multi-page web app experiences and embedded operational workflows.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Built for enterprise scale&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;We designed Looker Data Apps for demanding, governed enterprises. &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Every measure is grounded in the semantic layer.&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Every app you build directly inherits your existing semantic models, row-level security, and access controls. Calculations stay consistent across the enterprise, and built-in query inspection lets teams audit every line of generated SQL to eliminate metric hallucinations.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Zero-code by default.&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Deploy agent-generated React applications directly inside Looker with no code. Or users can use LLMs like Claude Code and Antigravity CLI to build interactive apps and deploy them as data apps in minutes.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;No runtime token costs.&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; LLM tokens are only consumed when you’re designing or generating the app. After that, every end-user interaction runs on native Looker APIs and models. Put a data app in front of 50 people or 5,000 and the marginal cost doesn't change.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;As easy as embedding a dashboard.&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; You can deploy your data apps into external portals using the same workflows you use to embed a dashboard. No new pipelines, no custom application code, no second permission models.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;From prototype to production in minutes&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The days of having to choose between basic dashboards and investing valuable engineering time to build bespoke systems are coming to an end. Instead of letting prototypes stall in sandboxes due to compliance and security barriers, Looker Data Apps allows teams to deploy governed, production-grade tools in minutes.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Looker Data Apps are now in preview. &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/looker/docs/data-apps"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Get started&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; today.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Mon, 12 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/business-intelligence/introducing-looker-data-apps/</guid><category>Data Analytics</category><category>Business Intelligence</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Trusted Data Apps for the Agentic Data Cloud, powered by Looker</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/business-intelligence/introducing-looker-data-apps/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Ani Jain</name><title>Group Product Manager, Google Cloud</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Sharon Zhang</name><title>Product Manager, Google Cloud</title><department></department><company></company></author></item><item><title>Modernizing Unstructured Data Workflows: Alteryx Live Query meets Google Cloud BigQuery</title><link>https://cloud.google.com/blog/products/data-analytics/modernize-unstructured-data-workloads-with-alteryx-and-bigquery/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Alteryx One Live Query and Google Cloud BigQuery redefine how enterprises handle complex, unstructured data at scale by reducing reliance on disconnected tools, minimizing data movement, and enabling warehouse-native execution.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Live Query provides an intuitive, browser-based environment that allows business users to build sophisticated data pipelines without writing a single line of code. When paired with the scale and performance of BigQuery, this duo enables secure SQL pushdown, meaning data transformation logic is executed directly within the warehouse rather than moving it across the network. This synergy is particularly potent for document-heavy workflows, where Live Query can orchestrate Google’s advanced AI and machine learning models — like Gemini — to extract intelligence from PDFs and images while maintaining the strict data governance and security of the BigQuery environment.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;From invoice PDFs to govern exception reporting in BigQuery with Live Query&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Finance and operations teams often find themselves buried under a mountain of vendor invoices. These documents come as PDFs with inconsistent data, varying invoice number formats, and a high risk of manual error. Traditionally, data teams have had to resort to manual data extraction or use a fragmented series of tools to move data into a warehouse — a process that is both time-consuming and prone to duplicates or amount mismatches.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;With the integration of &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Live Query for BigQuery&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;, you can now automate the entire lifecycle of an invoice. By processing PDFs, extracting key fields, and standardizing results directly within the BigQuery ecosystem, data teams can identify exceptions like anomalies or data issues within the documents faster while ensuring their governed enterprise data configured through the BigQuery fine grained access policies never has to leave the warehouse.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Solution overview: Extract, classify, validate, route, and post&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Let’s dive deeper into how the Live Query solution works. Invoice PDFs arrive as unstructured documents in Google Cloud Storage. In the Live Query workflow, the Document Extract tool extracts structured fields using the model selected by the user, such as Gemini or Document AI. The results are then standardized for reliable matching and compared against historical invoice records already stored and governed in BigQuery. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This automated workflow is designed to move from document to decision with minimal manual intervention. At enterprise scale, that pattern is not just about processing a handful of PDFs — it is about enabling analytics and AI over millions of unstructured documents while keeping reconciliation logic aligned with BigQuery. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;By combining AI-driven extraction with BigQuery-native execution, the solution provides:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Higher straight-through processing&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Reducing manual handling and allowing more invoices to move through the process automatically.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Faster reconciliation and fewer manual exceptions:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Comparing extracted invoices against BigQuery data earlier in the process so teams can identify duplicates and mismatches sooner, reducing the number of invoices that require manual review.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Stronger auditability&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Maintaining a clear trail of data from source to operational output.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Reduced data movement&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Keeping data resident in BigQuery and leverage its built-in capabilities for enhanced security, governance, and control.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Architecture: A Google Cloud-native pattern&lt;/strong&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/image1_1k1nSQi_c5ubZpu.max-1000x1000.jpg"
        
          alt="image1"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;At a high level, invoice PDFs are staged in Cloud Storage, processed through a Live Query workflow in the browser, reconciled against governed invoice history already resident in BigQuery, and written back as operational outputs for finance teams. The key architectural advantage of this pattern is that workflow authoring happens in the browser, while transformation and reconciliation logic are executed through platform services against the governed data environment.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Live Query &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;architecture is designed for warehouse-scale processing and governed execution.&lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt; &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;It uses secure SQL pushdown to execute transformation and reconciliation logic directly in &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;BigQuery&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;, and integrates with &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Gemini &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;for advanced AI capabilities such as document extraction, classification, and summarization.&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Live Query (Browser):&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Users author workflows visually in the browser, configuring document extraction, classification, cleansing, validation, and routing logic.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Alteryx One Platform Services: &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;The &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Transformation Service&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; coordinates request handling, execution planning, and result retrieval between the browser workflow and the customer data environment. The services also add traceability and observability across workflow execution, strengthening both operational monitoring and auditability.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Customer Google Cloud&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Invoice PDFs are staged in &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Google Cloud Storage (GCS)&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;, historical invoice data remains governed in &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;BigQuery&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;, AI-backed extraction runs against that environment, and the workflow outputs are written back into BigQuery.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In this pattern, the browser is the authoring layer, &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Alteryx One Platform Services&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; are the coordination layer, and&lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt; Google Cloud&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; is the governed data and execution layer. It allows workflow logic to be authored visually in &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Live Query&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; while execution remains aligned with governed data and warehouse-scale processing in &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;BigQuery&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Live query workflow walkthrough: From PDF to insight&lt;/strong&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/image2_PTc7471.max-1000x1000.jpg"
        
          alt="image2"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Let’s take a closer look at how the Live Query workflow handles unstructured PDFs, using an invoice as the example.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Ingest invoice PDFs&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;The workflow begins by pointing to a directory input in Google Cloud Storage, where the raw PDF files are stored. In practice, this step does more than just identify a folder: it enumerates the PDF locations and returns file-level metadata — such as absolute file paths, size, and created / updated timestamps — so the workflow can reliably pass the right document set into downstream extraction steps.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Extract key fields &lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Using Alteryx’s Document Extract tool, the workflow processes PDF invoices stored in Google Cloud Storage and extracts structured or semi-structured results directly in BigQuery. The extraction step uses the user-selected model, either Document AI or Gemini AI, depending on the workflow configuration. Under the hood, the tool builds a temporary external object table from the input document URIs and executes the appropriate function — ML.PROCESS_DOCUMENT for Document AI model or AI.GENERATE for Gemini AI model. For this workflow, the Gemini path is used, with AI.GENERATE returning the requested invoice fields into the downstream Live Query workflow. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;During interactive design, Live Query limits processing to a small subset of document URIs for preview, while runtime execution processes the full set of invoice PDFs.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;-- illustrative pattern only\r\nSELECT *\r\nFROM AI.GENERATE(\r\n  MODEL project.dataset.gemini_model,\r\n  (\r\n    SELECT\r\n      uri,\r\n      &amp;#x27;Extract invoice_number, invoice_amount, vendor_name, net_amount, tax_amount, and line_items.&amp;#x27; AS prompt\r\n    FROM project.dataset.temp_invoice_object_table\r\n  )\r\n);&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8a8a1b690&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Classify extracted content&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;After extraction, the workflow uses Alteryx’s Classify tool to apply zero-shot classification to the extracted invoice text. In this use case, line-item content is labeled into predefined business categories — such as industrial or office supplies — using AI.CLASSIFY in BigQuery, which returns a new predicted-label column into the downstream workflow. This business context makes the extracted data more useful for downstream reconciliation, exception handling, and reporting.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;quot;-- illustrative pattern only\r\nSELECT *,\r\n  AI.CLASSIFY(line_item_text, categories =&amp;gt; [&amp;#x27;industrial&amp;#x27;, &amp;#x27;office&amp;#x27;]) AS line_item_classify\r\nFROM upstream&amp;quot;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8a90ca090&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Normalize data&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;The extracted invoice numbers are cleansed and standardized so that minor formatting differences — such as whitespace or inconsistent formatting — do not hide potential duplicates during reconciliation.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Compare against history&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;The workflow joins the normalized current invoice records against historical invoice data already resident in BigQuery. This reconciliation step identifies records with matching invoice numbers already present in history and flags them as potential duplicates.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Flag exceptions&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;A formula step then applies business-rule logic to the remaining records. Those rules can vary by workflow and may include checks for amount mismatches, missing required fields, invalid totals, or other finance-specific exceptions. In this example, one rule checks whether &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;invoice_amount&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; matches &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;net_amount + tax_amount&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; and flags mismatches for review.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Produce operational outputs&lt;br/&gt;&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;The workflow produces two operational outputs: one for invoices matched to historical records and flagged as potential duplicates, and another for unmatched current invoices that have been validated, labeled for exceptions where needed, and prepared for unpaid-invoice processing.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The result is not just extracted data, but governed operational outputs that finance teams can review and act on immediately.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Summary: A governed document-to-decision workflow&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Our joint customers are excited for these new capabilities that will help improve business processes. &lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 40px;"&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;“What stood out to me about Alteryx One: Google Edition was how naturally it fits into the Google Cloud experience. I'm excited about the opportunity to make analytics more accessible by enabling business users to work with BigQuery data through an intuitive, governed experience.” &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;- &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Michael Wyant, Vice President, Enterprise Data &amp;amp; Corporate Solutions, Papa Johns&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This use case is more than just a simple extraction tool; it represents a strong Google Cloud-native pattern for transforming unstructured documents into actionable operational outputs. Instead of moving warehouse data into disconnected preparation tools, the workflow keeps storage, extraction, reconciliation, and output generation aligned with governed enterprise data already resident in BigQuery. By combining the intuitive design of Alteryx One Live Query with the scale and AI capabilities of BigQuery, finance teams can reduce manual effort, accelerate exception handling, and focus on higher-value strategic initiatives.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Fri, 09 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/data-analytics/modernize-unstructured-data-workloads-with-alteryx-and-bigquery/</guid><category>BigQuery</category><category>Partners</category><category>Data Analytics</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Modernizing Unstructured Data Workflows: Alteryx Live Query meets Google Cloud BigQuery</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/data-analytics/modernize-unstructured-data-workloads-with-alteryx-and-bigquery/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Kira Droganova</name><title>Senior Product Manager, Alteryx</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Rama Vundela</name><title>Data Analytics Specialist, Google</title><department></department><company></company></author></item><item><title>Managed Apache Iceberg at scale: How Spanner powers Lakehouse runtime catalog</title><link>https://cloud.google.com/blog/products/data-analytics/lakehouse-runtime-catalog-powered-by-spanner/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;As customers modernize to lakehouse architectures, they are standardizing on open formats such as Apache Iceberg to create a shared data estate across compatible engines. This enables you to build AI-native lakehouses that turn data to semantic knowledge, enable proactive action, and operate at an agentic scale.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;One of the key components of a lakehouse is the catalog, and in the Apache Iceberg environment, that usually means the Iceberg REST Catalog. An Apache Iceberg catalog is responsible for maintaining table pointers, handling atomic commits, and serving as the single source of truth for table locations. But as large enterprise organizations modernize to lakehouses, they have begun to realize that they need a highly scalable and available managed catalog as a part of their lakehouse architecture. This becomes even more important as querying scales with agents. To support a large amount of repeated small queries from agents, you will need to build on top of a managed catalog that provides atomicity, consistency, availability and concurrency at massive scale. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In this blog, we explore the challenges a managed catalog faces in modern cloud environments at agent scale, and show you how Google Cloud’s serverless &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/biglake-metastore-now-supports-iceberg-rest-catalog?e=a"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Lakehouse runtime catalog&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; can help address them. Powered by &lt;/span&gt;&lt;a href="https://cloud.google.com/spanner"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Spanner&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, Google Cloud’s always-on database with virtually unlimited scale, and built to meet the open Apache Iceberg REST catalog specification, the Lakehouse runtime catalog is the highly scalable and available foundation you need for the agentic era.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Challenges a managed catalog needs to solve in the Lakehouse&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;When speaking with data engineers and infrastructure leads running production analytics at scale in a Lakehouse, the following core pain points consistently emerge and need to be solved by a managed catalog: &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Atomic commits and concurrency control:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Iceberg guarantees ACID transactions via optimistic concurrency control (OCC). A managed catalog must implement a bulletproof atomic compare-and-swap (CAS) operation to swap the current metadata pointer.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;High availability and operational maintenance:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Because queries fail immediately if the catalog is down, a managed catalog becomes a critical Tier-1 service.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Scaling the database backing the catalog:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Catalog architects typically face a difficult trade-off when choosing a backing database for table metadata and state. Traditional scale-up relational databases provide SQL and ACID transactions, but hit vertical CPU, memory, storage and connection limits under heavy concurrent read/write loads unless manually sharded which incurs a huge operational overhead; while scale-out database systems are either eventually consistent, hard to manage, not enterprise-ready, or all of the above. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Table maintenance coordination:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; A catalog alone does not optimize data; you must build and operate ancillary pipelines for compaction, snapshot expiration, manifest rewriting, and orphan file cleanup.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Governance and security:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; A catalog acts as the security gatekeeper. The catalog must implement and maintain:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Authentication protocols (e.g., OAuth2 token exchange, IAM federation)&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Access control down to namespace and table levels&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Vended storage credentials (e.g., generating short-lived tokens so query engines don't need broad, direct storage credentials)&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Lakehouse runtime catalog&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To solve these challenges, we built the Lakehouse runtime catalog (GA) with support for Iceberg Rest Catalog. The Lakehouse runtime catalog is a fully serverless, highly available, and unified metadata registry designed from the ground up to support modern open table formats like&lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt; &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Apache Iceberg. By natively implementing the Apache Iceberg REST Catalog specification&lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;,&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; the Lakehouse runtime catalog decouples metadata discovery from compute engines, helping ensure multiple Iceberg-compatible engines can access a shared data estate and enabling you to take your workloads to production sooner. We’ve helped many customers streamline the migration of their managed catalogs. For example, &lt;/span&gt;&lt;a href="https://cloud.google.com/customers/etsy-lakehouse"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Etsy&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; migrated its catalog to Lakehouse runtime catalog, joining data in place to accelerate pipeline queries by 60%.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/1_bmVFk8w.max-1000x1000.jpg"
        
          alt="1"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This approach offers a number of architectural benefits:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Open APIs&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Support for Iceberg Rest Catalog enables different teams to use their preferred analytics tools on a single, unified dataset.&lt;/span&gt;&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Multi-engine interoperability&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Once registered, tables are immediately discoverable and queryable across Google Cloud Managed Service for Apache Spark, BigQuery, and open-source engines via standard REST interfaces. &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/the-future-of-data-lakehouse-for-the-agentic-era?e=0"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Read/write interoperability&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt; for Iceberg tables: &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Leverage Iceberg-compatible engines such as BigQuery, Managed Spark to write to Iceberg tables registered in the Lakehouse runtime catalog. Customers can also use Managed Spark to write to Iceberg tables in external catalogs.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Fully managed Iceberg storage with enterprise-grade features: &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Use Google's &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/unveiling-new-bigquery-capabilities-for-the-agentic-era?e=0"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;differentiated infrastructure&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to run analytics with performance on Iceberg tables. This gives you the benefits of open-source flexibility plus performance, scale, governance, and multimodal processing. &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Zero data copy&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Table definitions point directly to your existing data in the underlying object store. You do not move, rewrite, or duplicate your underlying data.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Bi-directional catalog federation&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;across clouds:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Access data from &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/lakehouse/docs/set-up-cross-cloud-connection-databricks"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Databricks Unity&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/lakehouse/docs/set-up-cross-cloud-connection-snowflake"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Snowflake Horizon&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/lakehouse/docs/set-up-cross-cloud-connection-aws-glue"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;AWS Glue&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; with support for vended credentials and OIDC token exchange. This lets you bring Google AI &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/introducing-the-borderless-lakehouse?e=0"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;directly to your AWS and Azure data&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Secure access using credential vending&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: The catalog supports multiple authorization mechanisms, letting you choose between &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/lakehouse/docs/credential-vending"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;credential vending&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and end-user credentials. This means that you can access tables with modern mechanisms such as credential vending without needing direct access to the files in the underlying object store (Cloud Storage, AWS S3, Azure Blob Storage). &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;AI-powered context and governance: &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;The Lakehouse runtime catalog integrates directly with &lt;/span&gt;&lt;a href="https://cloud.google.com/products/knowledge-catalog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Knowledge Catalog&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;a href="https://cloud.google.com/products/iam?e=0"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Cloud IAM&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, allowing you to define trusted context for your agents, and apply table-level security consistently across all compute engines.&lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt; &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Get out-of-the-box search, lineage, and insights for Iceberg tables in the catalog. &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Atomic commits and concurrency control, high availability and scalability: &lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;Backed by Google’s planet-scale infrastructure and Spanner, you get the high availability, concurrency and scale you need for your metadata to scale with your data. Support for Cloud Storage dual-region and multi-region buckets enables failover use cases. It also provides reduced TCO due to serverless and no-ops environments, and scalability for any workload size.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;What powers the Lakehouse runtime catalog?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The Lakehouse runtime catalog is a highly available, concurrent and scalable catalog with strong consistency guarantees because it is built on top of &lt;/span&gt;&lt;a href="https://cloud.google.com/spanner"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Spanner&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. Unlike traditional scale-up relational databases that hit vertical single-node ceilings, Spanner combines full relational SQL semantics and multi-table ACID transactions with the horizontal scale-out elasticity for both reads and writes of a NoSQL system. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline;"&gt;Spanner makes the Lakehouse runtime catalog highly available through Spanner’s &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/spanner/docs/instance-configurations#regional-configurations"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;regional configurations&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; with up to 99.99% availability. Spanner also delivers out-of-the-box scalability for  Lakehouse runtime catalog: As a horizontally scalable database, Spanner does not require manual sharding and scales compute and storage independently and transparently. Spanner dynamically monitors data volume and query load, splitting and redistributing data ranges across nodes. Compute nodes scale dynamically based on CPU utilization and storage thresholds. Spanner automatically detects split-level overload and moves heavy splits away from overloaded nodes. Spanner also lets Lakehouse runtime catalog users eliminate the &lt;/span&gt;&lt;a href="https://dl.acm.org/doi/abs/10.1145/2491245?__cf_chl_tk=oi5rkZKtX5q2CR93K9mrIHsAp_oqRxwaGqqpqq99v9Y-1790923307-1.0.1.1-pNUQvRr4OBosWiOcfxGuTWTD8I3JW_8V0i5xLuCsErU" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;traditional trade-offs&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; between relational consistency and distributed scalability, delivering Lakehouse runtime catalog’s industry-leading &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/spanner/docs/true-time-external-consistency"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;consistency guarantees&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. Lakehouse transactions are serializable — the order of transactions within the database is the same as the order in which clients observe the transactions to have been committed. &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;This foundation allows Lakehouse users to operate at agent-scale. &lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Then, to further power agentic use cases, the Lakehouse runtime catalog integrates directly with Knowledge Catalog to easily discover lakehouse Iceberg tables and provide trusted context to agents. Knowledge Catalog leverages an efficient combination of &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/spanner/docs/full-text-search"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;full-text search&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and native&lt;/span&gt;&lt;a href="https://docs.cloud.google.com/spanner/docs/vector-search-overview"&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;vector search&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; provided by Spanner; this approach enables better recall for search retrieval, pairing lexical keyword searches with semantic embeddings in a single query. Because both index types are built on the identical base dataset, they update with strict, transactional ACID consistency alongside base table DML operations. This removes operational overhead such as managing sync pipelines, and external-vector and full-text search systems. In short, the Lakehouse runtime catalog provides faster time-to-market for your agentic use cases.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Combine analytical and operational workloads&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;With Google Cloud’s borderless Lakehouse based on Apache Iceberg, you can combine your analytical data with your operational workloads. Use cases span combining data assets from your Lakehouse with OLTP data (from Spanner) for analytics, to low-latency serving applications where your Lakehouse assets are accessible in an operational database such as Spanner, to conversational analytics in first-party and third-party agents. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Below, in an example, you can see the Lakehouse runtime catalog with Spanner in action. Here, we combine analytical data for taxi trips in Manhattan (backed by Apache Iceberg) with operational data for taxi zones in Spanner to find the most congested traffic routes. The example also shows that you can also use a Conversational Analytics Agent to access the same data and get second-order insights.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/2_TvlKrOP.gif"
        
          alt="2"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="cjj42"&gt;Find out most congested traffic routes in Manhattan&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;strong style="vertical-align: baseline;"&gt;Modernize to the borderless Lakehouse&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Modernizing to Google Cloud’s&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;a href="https://cloud.google.com/solutions/data-lakehouse"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Lakehouse&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;minimizes data silos across analytics engines and agents, unifies multi-engine governance, provides trusted context to your agents and slashes operational TCO. Leveraging the Spanner-based Lakehouse &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/lakehouse/docs/set-up-lakehouse-iceberg-rest-catalog"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;runtime catalog&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; helps prepare your modern cloud environments to operate at agent-scale. To learn more and get started with a free trial, visit the &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://cloud.google.com/products/lakehouse?e=a"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Lakehouse&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; web&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;page and learn more about Spanner &lt;/span&gt;&lt;a href="https://cloud.google.com/spanner"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Tue, 06 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/data-analytics/lakehouse-runtime-catalog-powered-by-spanner/</guid><category>Databases</category><category>Data Analytics</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Managed Apache Iceberg at scale: How Spanner powers Lakehouse runtime catalog</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/data-analytics/lakehouse-runtime-catalog-powered-by-spanner/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Vinod Ramachandran</name><title>Product Manager</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Mina Mikhail</name><title>Software Engineering Manager</title><department></department><company></company></author></item><item><title>Accelerating analytics: PayPal’s journey with Managed Service for Apache Spark</title><link>https://cloud.google.com/blog/products/data-analytics/paypals-journey-with-managed-service-for-apache-spark/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In a data-driven world, PayPal’s ability to deliver timely and actionable insights is central to staying ahead. At PayPal, data powers everything from fraud detection to user experience enhancements. Data is also central to unleashing the potential of agentic solutions and experiences. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Over time, though, our analytics environment had become a complex ecosystem of various technologies and solutions assembled on-premise to address growing demands. While this approach supported our needs at the time, it began presenting new challenges to scale and maintain.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Navigating a challenging analytics landscape&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Due to expedited growth and acquisitions, our data analytics platform gradually turned into an uneven landscape. Each new platform or integration addressed a specific business need, but together, they increased operational overhead and introduced performance blockages. Scalability became increasingly difficult, and time-to-insight slowed as processes grew more complex. &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Complexity breeds stagnation&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;PayPal’s &lt;/span&gt;&lt;a href="https://cloud.google.com/blog/products/databases/paypals-historic-data-migration-is-the-foundation-for-its-gen-ai-innovation"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;legacy data analytics platform&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; was powerful—handling petabytes daily—but it was also increasingly rigid following rapid growth. Scaling up during peak retail events or global launches meant months of planning, slow manual provisioning of hardware, and too often, a compromise between speed and cost.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;As PayPal continued to scale globally, we recognized the need for a streamlined, unified infrastructure to drive data efficiency and accelerate innovation.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;The solution: Unified, cloud-native analytics&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;To overcome these obstacles, we migrated our analytics workloads from legacy Hadoop on-premise platforms to Google’s &lt;/span&gt;&lt;a href="https://cloud.google.com/products/managed-service-for-apache-spark"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Managed Service for Apache Spark&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Key reasons for this choice included:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Rapid provisioning and elastic scaling: Managed Spark enabled us to deploy clusters in minutes and scale based on processing needs, eliminating lengthy setup and idle resource costs. &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Unified infrastructure: Standardizing on Apache Spark created consistency across teams while leveraging Managed Service for Apache Spark and other managed services reduced operational complexity.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Seamless integration: Native hooks into &lt;/span&gt;&lt;a href="https://cloud.google.com/storage"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Cloud Storage&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; (GCS), &lt;/span&gt;&lt;a href="https://cloud.google.com/bigquery"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;BigQuery&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, and other Google Cloud services streamlined end-to-end data movement.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This move enabled PayPal to modernize our data processing capabilities, leveraging the flexibility, scalability, and reliability of cloud-native solutions. By consolidating previously disparate workflows and batch jobs that run on multiple platforms onto a single cloud-based analytics platform, we reduced data silos and built a unified data foundation that provides faster, richer insights. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;This empowered developers and application teams to focus on delivering business value rather than being limited by infrastructure. Crucially, this shift was about more than re-platforming. We fostered a new culture of experimentation, enabling teams to test, tune, and deploy analytics workloads quickly in response to changing business needs.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;The results: Faster insights, lower overhead&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The impact of our modernized Google Cloud-based ecosystem leveraging Managed Spark has been profound:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Processing times for core analytics workloads improved by 25%, enabling near real-time insights for key business operations.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;SLA adherence rose substantially by 30%, even during traffic surges such as seasonal sales events.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Operational costs dropped as we consolidated tooling and reduced manual maintenance.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;But perhaps most importantly, our engineers now spend less time firefighting and more time innovating, rapidly prototyping new analytics capabilities that deliver value to customers and partners.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Transitioning from a fragmented environment to a cohesive, cloud-native platform has fundamentally strengthened PayPal’s analytics capabilities. As business needs evolve, investing in a scalable, unified data foundation ensures that we can deliver insights with speed, precision, and impact—driving continued innovation for customers worldwide. Our journey with Managed Service for Apache  Spark is an important step in building that modern analytics foundation.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;Learn more about how you can get started with &lt;/span&gt;&lt;a href="https://cloud.google.com/products/managed-service-for-apache-spark"&gt;&lt;span style="font-style: italic; text-decoration: underline; vertical-align: baseline;"&gt;Managed Service for Apache Spark&lt;/span&gt;&lt;/a&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;a href="https://cloud.google.com/bigquery"&gt;&lt;span style="font-style: italic; text-decoration: underline; vertical-align: baseline;"&gt;BigQuery&lt;/span&gt;&lt;/a&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt; to build your &lt;/span&gt;&lt;a href="https://cloud.google.com/data-cloud"&gt;&lt;span style="font-style: italic; text-decoration: underline; vertical-align: baseline;"&gt;Agentic Data Cloud&lt;/span&gt;&lt;/a&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt; today.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Thu, 01 Oct 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/data-analytics/paypals-journey-with-managed-service-for-apache-spark/</guid><category>Financial Services</category><category>Data Analytics</category><media:content height="540" url="https://storage.googleapis.com/gweb-cloudblog-publish/images/paypal-apache-spark.max-600x600.png" width="540"></media:content><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Accelerating analytics: PayPal’s journey with Managed Service for Apache Spark</title><description></description><image>https://storage.googleapis.com/gweb-cloudblog-publish/images/paypal-apache-spark.max-600x600.png</image><site_name>Google</site_name><url>https://cloud.google.com/blog/products/data-analytics/paypals-journey-with-managed-service-for-apache-spark/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Vinod Ganesan</name><title>Director, Analytics Reliability Engineering, PayPal</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Raghu Agani</name><title>Sr. Manager, Big Data Platforms Engineering, PayPal</title><department></department><company></company></author></item><item><title>Empower your agents with the Google Cloud CLI remote MCP server</title><link>https://cloud.google.com/blog/products/ai-machine-learning/google-cloud-cli-remote-mcp-server-in-preview/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Today, we’re expanding our ecosystem of managed remote MCP servers by introducing the &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/sdk/use-gcloud-mcp"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Cloud CLI remote MCP server&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; in preview.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Powered by the popular &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/sdk/gcloud"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;gcloud&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/reference/bq-cli-reference"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;bq (BigQuery)&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; command-line tools, this new server gives AI agents immediate, broad access to command-line operations for managing Google Cloud infrastructure and working with advanced BigQuery workflows securely and seamlessly. &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Why CLI matters for AI agents&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Agents are increasingly performing complex cloud operations, but standardizing how they interact with backend systems remains a challenge. The Google Cloud CLI remote MCP server bridges this gap by packaging the versatility of hundreds of gcloud and bq commands into one single MCP server. This results in two strong benefits for the agent:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Higher-level abstractions:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; CLI commands package complex multi-step workflows, validation checks, and high-level operations into unified commands rather than requiring multi-step API orchestration.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Leverages model training:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; LLMs are heavily pre-trained on public command-line documentation, syntaxes, and usage examples, making CLI invocation intuitive and highly accurate for models.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;The benefits of putting CLI behind remote MCP&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Managing cloud infrastructure with AI agents traditionally requires installing and maintaining Google Cloud CLI binaries inside agent execution environments. The Cloud CLI remote MCP server bridges CLI capabilities with MCP benefits by providing an isolated execution sandbox on Google Cloud infrastructure. This solves key infrastructure challenges:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Simplified dependency and runtime management:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; For teams building custom agents, maintaining local CLI versions and dependencies across dev, test, and production environments creates operational overhead. Remote MCP eliminates local installations and runtime maintenance.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Access for web-based agent endpoints:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Web-hosted agent platforms and web interfaces (such as Gemini Enterprise and other hosted enterprise agent platforms) run in environments where users cannot control or install local packages. Remote MCP enables secure, managed access to Google Cloud CLI operations directly from these surfaces.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Enterprise-grade security and governance&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Connecting an AI agent to your infrastructure requires strict, enterprise-ready safeguards. This remote server leverages Google Cloud's standard identity and governance frameworks to keep your environments secure:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Zero ambient credentials:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; The server isolates execution in a network-restricted proxy boundary with no ambient credentials. Authentication and authorization are handled through &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/iam/docs/agent-identity-overview"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Agent Identity&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, &lt;/span&gt;&lt;a href="https://developers.google.com/identity/protocols/oauth2" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;OAuth 2.0&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, and &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/iam/docs"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Identity and Access Management (IAM)&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Strict policy enforcement:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Every command executed through the remote MCP server is run with the permissions of the authenticated caller identity. Both standard IAM permissions and organization policy service constraints are strictly enforced against downstream target resources.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Advanced protection with Model Armor:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; To minimize the risks associated with AI tool calling, the Cloud CLI remote MCP server integrates with &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/model-armor/model-armor-mcp-google-cloud-integration"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Model Armor&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. You can proactively screen LLM prompts and responses to protect against risks like prompt injection and malicious inputs.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Cloud audit logging:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; The Cloud CLI remote MCP server can be configured to log every tool invocation to Audit Logs (Data Access logs under cloudcli.googleapis.com/mcp). Security teams can gain full visibility into caller identities, OAuth clients, and IAM authorization decisions (mcp.googleapis.com/tools.call) without exposing sensitive command payloads or personally identifiable information (PII).&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Connecting to the Google Cloud CLI Remote MCP Server&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Integrating cloud management into your agents no longer requires packaging Google Cloud CLI binaries, managing local execution runtimes, or maintaining dependencies inside agent container images. Because the Google Cloud CLI remote MCP server implements the standard Model Context Protocol, any MCP-compatible agent platform or orchestration runtime can connect immediately via standard configuration:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;{\r\n  &amp;quot;mcpServers&amp;quot;: {\r\n    &amp;quot;google-cloud-cli&amp;quot;: {\r\n      &amp;quot;uri&amp;quot;: &amp;quot;https://cloudcli.googleapis.com/mcp&amp;quot;,\r\n      ...\r\n    }\r\n  }\r\n}&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb896eee150&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Your agent immediately gains access to execute gcloud and bq commands in a secure, network-isolated cloud sandbox.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Authentication is handled via keyless Agent Identity for hosted Google Cloud platforms, or standard OAuth 2.0 for external runtimes. For authentication options, see the &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/mcp/set-up-authentication-mcp-servers"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;MCP Authentication Guide&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Bringing infrastructure management to agents&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://docs.cloud.google.com/sdk/use-gcloud-mcp"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;The Cloud CLI remote MCP server&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; exposes two powerful tools, &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;run_gcloud_command&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;run_bq_command&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, giving your AI agents broad, immediate access to Google Cloud operations through natural language.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Managing cloud infrastructure with &lt;/strong&gt;&lt;code&gt;&lt;strong style="vertical-align: baseline;"&gt;run_gcloud_command&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;With &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;run_gcloud_command&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, agents can execute the full breadth of gcloud operations to manage, diagnose, and secure your Google Cloud environment. An example follows:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Observability and incident diagnostics&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: An agent streamlines incident diagnostics by automating command execution and reducing context-switching across tools.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/1_IPA9ALa.gif"
        
          alt="1"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Extending BigQuery operations with the run_bq_command tool&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;While the &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/bigquery/docs/use-bigquery-mcp"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;BigQuery MCP server&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; already helps organizations analyze and explore data using AI agents, with the introduction of &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;run_bq_command&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt;, agents can now tackle advanced BigQuery tasks such as resource allocation, job monitoring, and task scheduling by unlocking the full scope of &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/sdk/reference/mcp#mcp-tools"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;bq CLI&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; functionality. Key capabilities include:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Automating scheduled queries&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: An agent utilizes BigQuery Data Transfer Service configurations to schedule queries automatically. &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Job and resource management&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt;: Gain deep insight into query execution details, including processed data volume, slot usage, and execution plans, as well as managing reservations.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Access and permissions control:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Data administrators and owners can inspect and update table permissions directly through the agent.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/2_JA5HWbH.gif"
        
          alt="2"&gt;
        
        &lt;/a&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Pricing and availability&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The Google Cloud CLI MCP server is available today in public preview. There is no additional charge to use the MCP server itself. You pay only for the GCP resources you create and any applicable data transfer costs.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.cloud.google.com/sdk/use-gcloud-mcp"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;To get started&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, enable the Cloud CLI Execution API (`&lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;cloudcli.googleapis.com&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;`) in your Google Cloud project, grant the required &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;MCP Tool User&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; (`&lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;roles/mcp.toolUser&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt;`) IAM role to your agent or user identity, and configure your MCP client to connect to `cloudcli.googleapis.com/mcp`.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/sdk/use-gcloud-mcp"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Use the Google Cloud CLI Remote MCP Server Guide&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/sdk/reference/mcp#mcp-tools"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Cloud CLI MCP Reference&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/mcp/overview"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Cloud Remote MCP Servers Overview&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/mcp/supported-products"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Full List of Google OneMCP Servers&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/mcp/set-up-authentication-mcp-servers"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Set up authentication to Google and Google Cloud MCP servers&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/govern/agent-identity-overview"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Gemini Enterprise Agent Platform &amp;amp; Agent Identity Overview&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://www.youtube.com/watch?v=-fb0ycu4kiU" rel="noopener" target="_blank"&gt;&lt;span data-rich-links='{"fple-t":"Automate Google Cloud with Cloud CLI Remote MCP Server","fple-u":"https://www.youtube.com/watch?v=-fb0ycu4kiU","fple-mt":null,"type":"first-party-link"}' style="text-decoration: underline; vertical-align: baseline;"&gt;Automate Google Cloud with Cloud CLI Remote MCP Server&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><pubDate>Wed, 30 Sep 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/ai-machine-learning/google-cloud-cli-remote-mcp-server-in-preview/</guid><category>Data Analytics</category><category>Developers &amp; Practitioners</category><category>AI &amp; Machine Learning</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Empower your agents with the Google Cloud CLI remote MCP server</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/ai-machine-learning/google-cloud-cli-remote-mcp-server-in-preview/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Prosper Nwankpa</name><title>Senior Engineering Manager, Google Cloud</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Adam Hwang</name><title>Software Engineering Manager, Google Cloud</title><department></department><company></company></author></item><item><title>Introducing Ask, a new Google Earth Engine feature to accelerate geospatial coding</title><link>https://cloud.google.com/blog/products/data-analytics/accelerate-geospatial-coding-with-ai-in-google-earth-engine/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Whether you are mapping global forest cover, detecting changes in the built environment, or monitoring agricultural yields, writing scripts in &lt;/span&gt;&lt;a href="https://earthengine.google.com/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Earth Engine&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; is a powerful way to develop these insights. This platform is part of &lt;/span&gt;&lt;a href="https://ai.google/earth-ai/" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google Earth AI&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, our collection of geospatial models and datasets designed to help you transform planetary information into actionable intelligence, and we’ve launched a new feature, Ask, that makes accessing that planetary intelligence even easier. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;We know that translating complex geospatial logic into code takes time, and memorizing specific Google Earth Engine API functions, searching documentation, and debugging syntax or memory errors can interrupt your flow. Ask is designed to help you get to actionable insights faster, by integrating Gemini capabilities directly into the Google Earth Engine Code Editor.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Starting today, you can use your own Gemini API key to write, debug, understand, and optimize geospatial queries without ever leaving the Code Editor.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/1_hhaY4vo.max-1000x1000.jpg"
        
          alt="1"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="c2mdz"&gt;Figure 1: The new Ask panel resides on the right side of the Code Editor, providing chat-based AI assistance tailored to your active script.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;How it works: Context-aware assistance&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;You can ask a question directly in the Code Editor, and get a response based on context from your workspace, such as:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;The full text of your active script&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Your imported assets and geometries&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;span style="vertical-align: baseline;"&gt;Your active session chat history&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Because Gemini capabilities in Google Earth Engine automatically understand your work, you don’t have to add code or explain your datasets. It already knows these details, so it can provide more relevant, helpful answers. Additionally, you can automatically view the diff and merge it into your script. No more copy and pasting!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;You can also personalize Ask to make responses more comprehensive and suited to your needs:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Access the latest Gemini models:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Choose the Gemini model that meets your needs — at launch, the available models are Gemini 3 Flash Preview, Gemini 3.1 Pro Preview, and Gemini 3.5 Flash.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Docs search:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Use AI to search the official &lt;/span&gt;&lt;a href="https://developers.google.com/earth-engine" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;documentation&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; for up-to-date syntax and functions.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Dataset search:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Allow AI to search the &lt;/span&gt;&lt;a href="https://developers.google.com/earth-engine/datasets" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Earth Engine Data Catalog&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to find and reference the exact datasets you need.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Google Search:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Grounds response in the latest public web results using Grounding with Google Search (mutually exclusive with docs search and dataset search).&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Quick-start examples&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Not sure where to start? Here are four ways you can use Ask in your workflows:&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;1. Generate code from natural language&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Need to calculate NDVI (“Normalized Difference Vegetation Index”), perform a cloud mask, or build a chart, but can't remember the exact syntax? Just ask and Earth Engine can generate JavaScript code for you. You can review the code directly in the chat and click &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Insert&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; to add it to your script, or &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Copy&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; it to your clipboard. If your editor is not empty, inserting code displays a side-by-side diff view so you can review changes before accepting them.&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 40px;"&gt;&lt;strong style="vertical-align: baseline;"&gt;Prompt example:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;"Write a script to load Sentinel-2 imagery for 2025 over Boulder, CO, apply a cloud mask, calculate NDVI, and add the median composite to the map."&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;2. Explain complex code&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;If you’re working with a script written by a colleague or adapting an example from the community, you can use Gemini capabilities to explain it. Simply ask, &lt;/span&gt;&lt;span style="font-style: italic; vertical-align: baseline;"&gt;"Explain what this script does,"&lt;/span&gt;&lt;span style="vertical-align: baseline;"&gt; and receive a step-by-step breakdown of the logic and Earth Engine functions being used.&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;3.  Perform one-click troubleshooting and debugging&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Debugging is an inevitable part of coding. When your script throws an error in Google Earth Engine, the Console displays an error message. Now, those messages include a &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;"Troubleshoot"&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; button. Clicking it automatically populates the Ask panel with a prompt that contains the error message and a request for help to diagnose the issue and suggest a fix.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="block-image_full_width"&gt;






  
    &lt;div class="article-module h-c-page"&gt;
      &lt;div class="h-c-grid"&gt;
  

    &lt;figure class="article-image--large
      
      
        h-c-grid__col
        h-c-grid__col--6 h-c-grid__col--offset-3
        
        
      "
      &gt;

      
      
        
        &lt;img
            src="https://storage.googleapis.com/gweb-cloudblog-publish/images/2_qed5vZZ.max-1000x1000.jpg"
        
          alt="2"&gt;
        
        &lt;/a&gt;
      
        &lt;figcaption class="article-image__caption "&gt;&lt;p data-block-key="gvxcy"&gt;Figure 2: The "Troubleshoot" button in the Console makes debugging errors fast and frictionless.&lt;/p&gt;&lt;/figcaption&gt;
      
    &lt;/figure&gt;

  
      &lt;/div&gt;
    &lt;/div&gt;
  




&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;4. Optimize queries&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;If your script is, for example, running slowly, consuming resources inefficiently, throwing "computation timed out" or "too many concurrent aggregations" errors, ask for optimization tips. Gemini capabilities can suggest best practices like early filtering, reducing computation steps, or converting client-side loops into server-side operations.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Get started in two steps&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Ask is available globally today. To get started, you just need a Gemini API key:&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Get an API key:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; If you don’t already have a Gemini API key, head to &lt;/span&gt;&lt;a href="https://aistudio.google.com/app/apikey" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Google AI Studio&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; and create one (there are free options; if you choose a paid-tier API key, you will be billed for your usage). Learn more about &lt;/span&gt;&lt;a href="https://ai.google.dev/terms" rel="noopener" target="_blank"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Gemini API terms&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: decimal; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Add the API key to GEE:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Open the Google Earth Engine Code Editor. On the right-hand panel, click the &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;Ask&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; panel. Click the key icon in the bottom left corner and enter your API key.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;We want to hear from you! Please use the Code Editor Feedback button to share your feedback and help us improve the experience.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Mon, 28 Sep 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/data-analytics/accelerate-geospatial-coding-with-ai-in-google-earth-engine/</guid><category>Maps &amp; Geospatial</category><category>Data Analytics</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Introducing Ask, a new Google Earth Engine feature to accelerate geospatial coding</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/data-analytics/accelerate-geospatial-coding-with-ai-in-google-earth-engine/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Joel Conkling</name><title>Product Lead</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Katie Friis</name><title>Software Engineer</title><department></department><company></company></author></item><item><title>Maximizing Apache Spark availability: Mitigating compute stockouts with flexible VMs and other best practices</title><link>https://cloud.google.com/blog/products/data-analytics/maximize-apache-spark-availability-with-flexible-vms/</link><description>&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;The surge in AI development has created unprecedented demand for compute capacity around the globe. This can have negative implications for data processing and pipelines with Apache Spark. Whether you are managing your own Spark infrastructure or using a managed service, you can face availability constraints. However, a significant advantage of using Google’s &lt;/span&gt;&lt;a href="https://cloud.google.com/products/managed-service-for-apache-spark"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Managed Service for Apache Spark&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; is the availability of &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/managed-spark/docs/concepts/configuring-clusters/flexible-vms"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;flexible VMs,&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; which provide a targeted mechanism to adopt a dynamic, resource-agnostic philosophy and ensure your pipelines remain operational, even during regional or zonal capacity stockouts.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Understanding capacity stockouts&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Capacity stockouts occur when demand for a specific machine family (such as N2 or N2D) exceeds available capacity in a target zone or region. For time-sensitive analytics pipelines, rigid single-VM requirements transform standard provisioning into a single point of failure which can result in cluster creation delays, failed executions, and potentially compromised business SLAs.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Flexible VMs&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Flexible VMs fundamentally overhaul how a Managed Spark cluster requests compute resources. Rather than binding a cluster to a rigid instance type, flexible VMs allow teams to establish an ordered list of acceptable machine families for master, primary worker, and secondary worker nodes.&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;Key features&lt;/span&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Multi-family blending:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Mix nodes across diverse machine types and generations, combining Gen2 families (e.g., N2, N2D) with Gen4 families (e.g., N4, C4) in a single configuration.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Mixed storage support:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Broaden available capacity pools by allowing storage options to dynamically adapt to the underlying host family's supported disk types.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Comprehensive cluster coverage:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Apply flexible rules to primary workers, secondary (preemptible/spot) workers, and master nodes to guarantee cluster provisioning end-to-end.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Ranked configuration: A strategy for success&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;A successful flexible VM implementation relies on intentional ranking. By defining a clear hierarchy of options, Managed Spark clusters automatically attempt provisioning, systematically mitigating stockout risks without requiring manual intervention. To improve the availability of  suitable VMs, we recommend specifying at least two machine families in the highest priority (Rank 0) flexible VM list.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;As an example, for production pipelines standardizing on &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;n2d-standard-16&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; shapes, the following tiering strategy provides robust resilience against capacity constraints:&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div align="left"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;&lt;table style="width: 98.9556%;"&gt;&lt;colgroup&gt;&lt;col style="width: 23.9583%;"/&gt;&lt;col style="width: 41.0156%;"/&gt;&lt;col style="width: 35.026%;"/&gt;&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Rank&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;th scope="col" style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Machine family examples&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;th scope="col" style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Storage recommendation&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Rank 0 (Primary)&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;n2d-standard-16, n2-standard-16&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span data-rich-links='{"dde_di":"kix.ggbi3pqb29vd","dde-fdv":"Standard Local SSD or PD","dde-sii":"dropdownItem.w6kf4s2yvnl8","ddefe-ddi":{"cv":{"op":"set","opValue":[{"di-id":"dropdownItem.64xdhfe3knvm","di-v":"Hyperdisk Balanced","di-dv":"Hyperdisk Balanced","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.w6kf4s2yvnl8","di-v":"Standard Local SSD or PD","di-dv":"Standard Local SSD or PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.9kbsce39m365","di-v":"Standard PD","di-dv":"Standard PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}}]}},"ddefe-t":"Storage Recommendation","type":"dropdown"}' style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span data-rich-links='{"dde_di":"kix.ggbi3pqb29vd","dde-fdv":"Standard Local SSD or PD","dde-sii":"dropdownItem.w6kf4s2yvnl8","ddefe-ddi":{"cv":{"op":"set","opValue":[{"di-id":"dropdownItem.64xdhfe3knvm","di-v":"Hyperdisk Balanced","di-dv":"Hyperdisk Balanced","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.w6kf4s2yvnl8","di-v":"Standard Local SSD or PD","di-dv":"Standard Local SSD or PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.9kbsce39m365","di-v":"Standard PD","di-dv":"Standard PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}}]}},"ddefe-t":"Storage Recommendation","type":"dropdown"}' style="vertical-align: baseline;"&gt;Standard Local SSD or PD&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Rank 1&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;n4-standard-16, n4d-standard-16&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span data-rich-links='{"dde_di":"kix.ggbi3pqb29vd","dde-fdv":"Hyperdisk Balanced","dde-sii":"dropdownItem.64xdhfe3knvm","ddefe-ddi":{"cv":{"op":"set","opValue":[{"di-id":"dropdownItem.64xdhfe3knvm","di-v":"Hyperdisk Balanced","di-dv":"Hyperdisk Balanced","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.w6kf4s2yvnl8","di-v":"Standard Local SSD or PD","di-dv":"Standard Local SSD or PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.9kbsce39m365","di-v":"Standard PD","di-dv":"Standard PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}}]}},"ddefe-t":"Storage Recommendation","type":"dropdown"}' style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span data-rich-links='{"dde_di":"kix.ggbi3pqb29vd","dde-fdv":"Hyperdisk Balanced","dde-sii":"dropdownItem.64xdhfe3knvm","ddefe-ddi":{"cv":{"op":"set","opValue":[{"di-id":"dropdownItem.64xdhfe3knvm","di-v":"Hyperdisk Balanced","di-dv":"Hyperdisk Balanced","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.w6kf4s2yvnl8","di-v":"Standard Local SSD or PD","di-dv":"Standard Local SSD or PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.9kbsce39m365","di-v":"Standard PD","di-dv":"Standard PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}}]}},"ddefe-t":"Storage Recommendation","type":"dropdown"}' style="vertical-align: baseline;"&gt;Hyperdisk Balanced&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Rank 2&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;c4-standard-16, c3-standard-22&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span data-rich-links='{"dde_di":"kix.ggbi3pqb29vd","dde-fdv":"Hyperdisk Balanced","dde-sii":"dropdownItem.64xdhfe3knvm","ddefe-ddi":{"cv":{"op":"set","opValue":[{"di-id":"dropdownItem.64xdhfe3knvm","di-v":"Hyperdisk Balanced","di-dv":"Hyperdisk Balanced","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.w6kf4s2yvnl8","di-v":"Standard Local SSD or PD","di-dv":"Standard Local SSD or PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.9kbsce39m365","di-v":"Standard PD","di-dv":"Standard PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}}]}},"ddefe-t":"Storage Recommendation","type":"dropdown"}' style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span data-rich-links='{"dde_di":"kix.ggbi3pqb29vd","dde-fdv":"Hyperdisk Balanced","dde-sii":"dropdownItem.64xdhfe3knvm","ddefe-ddi":{"cv":{"op":"set","opValue":[{"di-id":"dropdownItem.64xdhfe3knvm","di-v":"Hyperdisk Balanced","di-dv":"Hyperdisk Balanced","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.w6kf4s2yvnl8","di-v":"Standard Local SSD or PD","di-dv":"Standard Local SSD or PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.9kbsce39m365","di-v":"Standard PD","di-dv":"Standard PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}}]}},"ddefe-t":"Storage Recommendation","type":"dropdown"}' style="vertical-align: baseline;"&gt;Hyperdisk Balanced&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Rank 3 &lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;e2-standard-16&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span data-rich-links='{"dde_di":"kix.ggbi3pqb29vd","dde-fdv":"Standard PD","dde-sii":"dropdownItem.9kbsce39m365","ddefe-ddi":{"cv":{"op":"set","opValue":[{"di-id":"dropdownItem.64xdhfe3knvm","di-v":"Hyperdisk Balanced","di-dv":"Hyperdisk Balanced","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.w6kf4s2yvnl8","di-v":"Standard Local SSD or PD","di-dv":"Standard Local SSD or PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.9kbsce39m365","di-v":"Standard PD","di-dv":"Standard PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}}]}},"ddefe-t":"Storage Recommendation","type":"dropdown"}' style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span data-rich-links='{"dde_di":"kix.ggbi3pqb29vd","dde-fdv":"Standard PD","dde-sii":"dropdownItem.9kbsce39m365","ddefe-ddi":{"cv":{"op":"set","opValue":[{"di-id":"dropdownItem.64xdhfe3knvm","di-v":"Hyperdisk Balanced","di-dv":"Hyperdisk Balanced","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.w6kf4s2yvnl8","di-v":"Standard Local SSD or PD","di-dv":"Standard Local SSD or PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.9kbsce39m365","di-v":"Standard PD","di-dv":"Standard PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}}]}},"ddefe-t":"Storage Recommendation","type":"dropdown"}' style="vertical-align: baseline;"&gt;Standard PD&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="block-code"&gt;&lt;dl&gt;
    &lt;dt&gt;code_block&lt;/dt&gt;
    &lt;dd&gt;&amp;lt;ListValue: [StructValue([(&amp;#x27;code&amp;#x27;, &amp;#x27;gcloud dataproc clusters create $CLUSTER_NAME \\\r\n--num-workers=10 \\\r\n--zone=&amp;quot;&amp;quot; \\\r\n--region=us-east1 \\\r\n--worker-instance-selection=\&amp;#x27;{&amp;quot;machineTypes&amp;quot;:[&amp;quot;n2d-standard-16&amp;quot;,&amp;quot;n2-standard-16&amp;quot;],&amp;quot;rank&amp;quot;:0,&amp;quot;diskConfig&amp;quot;:{&amp;quot;bootDiskType&amp;quot;:&amp;quot;pd-standard&amp;quot;,&amp;quot;bootDiskSizeGb&amp;quot;:400}}\&amp;#x27; \\\r\n--worker-instance-selection=\&amp;#x27;{&amp;quot;machineTypes&amp;quot;:[&amp;quot;n4-standard-16&amp;quot;,&amp;quot;n4d-standard-16&amp;quot;],&amp;quot;rank&amp;quot;:1,&amp;quot;diskConfig&amp;quot;:{&amp;quot;bootDiskType&amp;quot;:&amp;quot;hyperdisk-balanced&amp;quot;,&amp;quot;bootDiskSizeGb&amp;quot;:400}}\&amp;#x27; \\\r\n--worker-instance-selection=\&amp;#x27;{&amp;quot;machineTypes&amp;quot;:[&amp;quot;c4-standard-16&amp;quot;,&amp;quot;c3-standard-22&amp;quot;],&amp;quot;rank&amp;quot;:2,&amp;quot;diskConfig&amp;quot;:{&amp;quot;bootDiskType&amp;quot;:&amp;quot;hyperdisk-balanced&amp;quot;,&amp;quot;bootDiskSizeGb&amp;quot;:400}}\&amp;#x27; \\\r\n--worker-instance-selection=\&amp;#x27;{&amp;quot;machineTypes&amp;quot;:[&amp;quot;e2-standard-16&amp;quot;],&amp;quot;rank&amp;quot;:3, &amp;quot;diskConfig&amp;quot;:{&amp;quot;bootDiskType&amp;quot;:&amp;quot;pd-ssd&amp;quot;,&amp;quot;bootDiskSizeGb&amp;quot;:400}}\&amp;#x27; \\\r\n--master-instance-selection=\&amp;#x27;{&amp;quot;machineTypes&amp;quot;:[&amp;quot;n4-standard-16&amp;quot;,&amp;quot;n4d-standard-16&amp;quot;],&amp;quot;rank&amp;quot;:0,&amp;quot;diskConfig&amp;quot;:{&amp;quot;bootDiskType&amp;quot;:&amp;quot;hyperdisk-balanced&amp;quot;,&amp;quot;bootDiskSizeGb&amp;quot;:400}}\&amp;#x27;&amp;#x27;), (&amp;#x27;language&amp;#x27;, &amp;#x27;&amp;#x27;), (&amp;#x27;caption&amp;#x27;, &amp;lt;wagtail.rich_text.RichText object at 0x7fb8a8b859d0&amp;gt;)])]&amp;gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;
&lt;div class="block-paragraph_advanced"&gt;&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;For pipelines standardizing on legacy &lt;/span&gt;&lt;strong style="vertical-align: baseline;"&gt;n1-standard-16&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; shapes, the following tiering strategy helps transition workloads toward newer, more available architectures while preserving operational stability:&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div align="left"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;
&lt;div style="color: #5f6368; overflow-x: auto; overflow-y: hidden; width: 100%;"&gt;&lt;table style="width: 99.7389%;"&gt;&lt;colgroup&gt;&lt;col style="width: 25.625%;"/&gt;&lt;col style="width: 36.875%;"/&gt;&lt;col style="width: 37.3438%;"/&gt;&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Rank&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;th scope="col" style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Machine family examples&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;th scope="col" style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Storage recommendation&lt;/strong&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Rank 0 (Primary)&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;n1-standard-16&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;n2-standard-16&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span data-rich-links='{"dde_di":"kix.ggbi3pqb29vd","dde-fdv":"","dde-sii":"dropdownItem.w6kf4s2yvnl8","ddefe-ddi":{"cv":{"op":"set","opValue":[{"di-id":"dropdownItem.64xdhfe3knvm","di-v":"Hyperdisk Balanced","di-dv":"Hyperdisk Balanced","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.w6kf4s2yvnl8","di-v":"Standard Local SSD or PD","di-dv":"Standard Local SSD or PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.9kbsce39m365","di-v":"Standard PD","di-dv":"Standard PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}}]}},"ddefe-t":"Storage Recommendation","type":"dropdown"}' style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span data-rich-links='{"dde_di":"kix.ggbi3pqb29vd","dde-fdv":"","dde-sii":"dropdownItem.w6kf4s2yvnl8","ddefe-ddi":{"cv":{"op":"set","opValue":[{"di-id":"dropdownItem.64xdhfe3knvm","di-v":"Hyperdisk Balanced","di-dv":"Hyperdisk Balanced","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.w6kf4s2yvnl8","di-v":"Standard Local SSD or PD","di-dv":"Standard Local SSD or PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.9kbsce39m365","di-v":"Standard PD","di-dv":"Standard PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}}]}},"ddefe-t":"Storage Recommendation","type":"dropdown"}' style="vertical-align: baseline;"&gt;Standard Local SSD or PD&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Rank 1&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;n2d-standard-16&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span data-rich-links='{"dde_di":"kix.ggbi3pqb29vd","dde-fdv":"","dde-sii":"dropdownItem.w6kf4s2yvnl8","ddefe-ddi":{"cv":{"op":"set","opValue":[{"di-id":"dropdownItem.64xdhfe3knvm","di-v":"Hyperdisk Balanced","di-dv":"Hyperdisk Balanced","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.w6kf4s2yvnl8","di-v":"Standard Local SSD or PD","di-dv":"Standard Local SSD or PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.9kbsce39m365","di-v":"Standard PD","di-dv":"Standard PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}}]}},"ddefe-t":"Storage Recommendation","type":"dropdown"}' style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span data-rich-links='{"dde_di":"kix.ggbi3pqb29vd","dde-fdv":"","dde-sii":"dropdownItem.w6kf4s2yvnl8","ddefe-ddi":{"cv":{"op":"set","opValue":[{"di-id":"dropdownItem.64xdhfe3knvm","di-v":"Hyperdisk Balanced","di-dv":"Hyperdisk Balanced","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.w6kf4s2yvnl8","di-v":"Standard Local SSD or PD","di-dv":"Standard Local SSD or PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.9kbsce39m365","di-v":"Standard PD","di-dv":"Standard PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}}]}},"ddefe-t":"Storage Recommendation","type":"dropdown"}' style="vertical-align: baseline;"&gt;Standard Local SSD or PD&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Rank 2&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;n4-standard-16&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;n4d-standard-16&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span data-rich-links='{"dde_di":"kix.ggbi3pqb29vd","dde-fdv":"","dde-sii":"dropdownItem.64xdhfe3knvm","ddefe-ddi":{"cv":{"op":"set","opValue":[{"di-id":"dropdownItem.64xdhfe3knvm","di-v":"Hyperdisk Balanced","di-dv":"Hyperdisk Balanced","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.w6kf4s2yvnl8","di-v":"Standard Local SSD or PD","di-dv":"Standard Local SSD or PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.9kbsce39m365","di-v":"Standard PD","di-dv":"Standard PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}}]}},"ddefe-t":"Storage Recommendation","type":"dropdown"}' style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span data-rich-links='{"dde_di":"kix.ggbi3pqb29vd","dde-fdv":"","dde-sii":"dropdownItem.64xdhfe3knvm","ddefe-ddi":{"cv":{"op":"set","opValue":[{"di-id":"dropdownItem.64xdhfe3knvm","di-v":"Hyperdisk Balanced","di-dv":"Hyperdisk Balanced","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.w6kf4s2yvnl8","di-v":"Standard Local SSD or PD","di-dv":"Standard Local SSD or PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.9kbsce39m365","di-v":"Standard PD","di-dv":"Standard PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}}]}},"ddefe-t":"Storage Recommendation","type":"dropdown"}' style="vertical-align: baseline;"&gt;Hyperdisk Balanced&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;strong style="vertical-align: baseline;"&gt;Rank 3&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;e2-standard-16&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="vertical-align: middle; border: 1px solid #000000; padding: 16px;"&gt;
&lt;p&gt;&lt;span data-rich-links='{"dde_di":"kix.ggbi3pqb29vd","dde-fdv":"","dde-sii":"dropdownItem.9kbsce39m365","ddefe-ddi":{"cv":{"op":"set","opValue":[{"di-id":"dropdownItem.64xdhfe3knvm","di-v":"Hyperdisk Balanced","di-dv":"Hyperdisk Balanced","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.w6kf4s2yvnl8","di-v":"Standard Local SSD or PD","di-dv":"Standard Local SSD or PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.9kbsce39m365","di-v":"Standard PD","di-dv":"Standard PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}}]}},"ddefe-t":"Storage Recommendation","type":"dropdown"}' style="vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span data-rich-links='{"dde_di":"kix.ggbi3pqb29vd","dde-fdv":"","dde-sii":"dropdownItem.9kbsce39m365","ddefe-ddi":{"cv":{"op":"set","opValue":[{"di-id":"dropdownItem.64xdhfe3knvm","di-v":"Hyperdisk Balanced","di-dv":"Hyperdisk Balanced","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.w6kf4s2yvnl8","di-v":"Standard Local SSD or PD","di-dv":"Standard Local SSD or PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}},{"di-id":"dropdownItem.9kbsce39m365","di-v":"Standard PD","di-dv":"Standard PD","di-ts":{"ts_bd":false,"ts_fs":11,"ts_ff":"Arial","ts_it":false,"ts_sc":false,"ts_st":false,"ts_tw":400,"ts_un":false,"ts_va":"nor","ts_bgc2":{"clr_type":0,"hclr_color":null},"ts_fgc2":{"clr_type":0,"hclr_color":null},"ts_bd_i":false,"ts_fs_i":false,"ts_ff_i":false,"ts_it_i":false,"ts_sc_i":false,"ts_st_i":false,"ts_un_i":false,"ts_va_i":false,"ts_bgc2_i":false,"ts_fgc2_i":false},"di-cv":{"dicv_v":0,"dicv_ft":0}}]}},"ddefe-t":"Storage Recommendation","type":"dropdown"}' style="vertical-align: baseline;"&gt;Standard PD&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Leveraging Hyperdisk Balanced&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Unlocking maximum availability with flexible VMs often requires adopting modern storage architectures like &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/compute/docs/disks/hd-types/hyperdisk-balanced"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Hyperdisk Balanced&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;. Newer instance families (including N4 and C4) rely on Hyperdisk to deliver predictable performance across variable VM sizes. Starting with default IOPS and throughput settings typically provides a reliable baseline for the majority of distributed Spark jobs.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Trade-offs and key considerations&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;While flexible VMs  dramatically improve cluster provisioning success, aligning them with enterprise requirements involves evaluating several architectural and financial factors:&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;1. Resource quotas&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;It is no longer enough to have one specific machine (e.g., N2) quota. You need to ensure you have sufficient compute and disk quotas allocated for all specific machine types and disks (including Hyperdisk) defined in their flexible VM lists.&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;2. Compute flexible Committed Use Discounts (CUDs)&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Traditional, resource-based CUDs are tied to specific machine families, which limits flexibility. Adopt &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/compute/docs/instances/committed-use-discounts-overview#spend_based"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;Compute flexible Committed Use Discounts (CUDs)&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; to apply savings across multiple VM families and regions.&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;&lt;span style="vertical-align: baseline;"&gt;3. Performance Characteristics&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Performance can vary between machine generations, as well as between Local SSD and Hyperdisk. While the Managed Spark team maintains &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/compute/docs/machine-resource"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;internal benchmarks for these comparisons&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt;, actual outcomes are workload-dependent. Testing your specific Spark jobs across these families is essential for understanding SLA impacts.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Additional recommendations&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;In addition to implementing flexible VMs, there are several other key architectural and scheduling strategies to improve resource availability and workload stability:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;AutoZone:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Implement &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/managed-spark/docs/concepts/configuring-clusters/auto-zone"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;AutoZone&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; routing to allow Managed Spark to automatically select the zone best suited to execute the job based on current capacity.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Smaller machine shapes:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Avoid high in demand, large-core shapes. Design workloads and YARN containers to utilize &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/compute/docs/general-purpose-machines"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;smaller machine shapes&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; (such as 4, 8, or 16 cores). These smaller shapes are much easier to fulfill from the available GCE on-demand pool.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Autoscaling:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Deploy cluster &lt;/span&gt;&lt;a href="https://docs.cloud.google.com/managed-spark/docs/concepts/configuring-clusters/autoscaling"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;autoscaling&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; with reasonable &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;maxInstances&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; to manage capacity effectively for bursty or unpredictable workloads without relying on rigid, massive upfront provisioning.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;a href="https://docs.cloud.google.com/managed-spark/docs/guides/create-partial-cluster"&gt;&lt;strong style="text-decoration: underline; vertical-align: baseline;"&gt;Partial cluster creation&lt;/strong&gt;&lt;/a&gt;&lt;strong style="vertical-align: baseline;"&gt;:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Configure a minimum acceptable number of primary workers. This allows clusters to spin up under resource constraints and begin executing, while autoscaling can dynamically add remaining workers as resources become available.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li aria-level="1" style="list-style-type: disc; vertical-align: baseline;"&gt;
&lt;p role="presentation"&gt;&lt;strong style="vertical-align: baseline;"&gt;Establish regional fallbacks:&lt;/strong&gt;&lt;span style="vertical-align: baseline;"&gt; Some regions, such as &lt;/span&gt;&lt;code style="vertical-align: baseline;"&gt;us-central1,&lt;/code&gt;&lt;span style="vertical-align: baseline;"&gt; can experience  high demand. Setting up fallbacks to other regions reduces capacity stockout risks.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;span style="vertical-align: baseline;"&gt;Keep your Spark jobs running with flexible VMs&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Managing your own Apache Spark infrastructure can be complex, especially when capacity stockouts disrupt your data processing. Utilizing a managed service like Managed Service for Apache Spark provides unique advantages — including built-in platform resilience and access to flexible VMs. By adopting a prioritized fallback strategy with flexible VMs, you can protect your workloads from regional hardware shortages and keep your critical pipelines running.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="vertical-align: baseline;"&gt;Ready to improve your Spark workload resilience? Start configuring&lt;/span&gt; &lt;a href="https://docs.cloud.google.com/managed-spark/docs/concepts/configuring-clusters/flexible-vms"&gt;&lt;span style="text-decoration: underline; vertical-align: baseline;"&gt;flexible VMs&lt;/span&gt;&lt;/a&gt;&lt;span style="vertical-align: baseline;"&gt; for your Managed Spark clusters today.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Mon, 21 Sep 2026 16:00:00 +0000</pubDate><guid>https://cloud.google.com/blog/products/data-analytics/maximize-apache-spark-availability-with-flexible-vms/</guid><category>Open Source</category><category>Data Analytics</category><og xmlns:og="http://ogp.me/ns#"><type>article</type><title>Maximizing Apache Spark availability: Mitigating compute stockouts with flexible VMs and other best practices</title><description></description><site_name>Google</site_name><url>https://cloud.google.com/blog/products/data-analytics/maximize-apache-spark-availability-with-flexible-vms/</url></og><author xmlns:author="http://www.w3.org/2005/Atom"><name>Sravani Bobbala</name><title>Software Engineering Manager</title><department></department><company></company></author><author xmlns:author="http://www.w3.org/2005/Atom"><name>Qiqi Wu</name><title>Product Manager</title><department></department><company></company></author></item></channel></rss>