Ingest data from Google Search Console

Important

This feature is in Beta. Workspace admins can control access to this feature from the Previews page. See Manage Azure Databricks previews.

This page shows how to create a managed Google Search Console ingestion pipeline using Lakeflow Connect.

Requirements

  • To create an ingestion pipeline, first meet the following requirements:

    • Your workspace must be enabled for Unity Catalog.

    • Serverless compute must be enabled for your workspace. See Serverless compute requirements.

    • To create a new connection, you must have CREATE CONNECTION privileges on the metastore. See Manage privileges in Unity Catalog.

      If the connector supports UI-based pipeline authoring, an admin can create the connection and the pipeline at the same time by completing the steps on this page. However, if the users who create pipelines use API-based pipeline authoring or are non-admin users, an admin must first create the connection in Catalog Explorer. See Connect to managed ingestion sources.

    • To use an existing connection, you must have USE CONNECTION privileges or ALL PRIVILEGES on the connection object.

    • You must have USE CATALOG privileges on the target catalog.

    • You must have USE SCHEMA and CREATE TABLE privileges on an existing schema or CREATE SCHEMA privileges on the target catalog.

  • To ingest from Google Search Console, first configure authentication from Azure Databricks and create a connection. See Configure authentication to Google Search Console and Create a Google Search Console connection.

Connector options

Set pipeline-scoped options in source_configurations and table-scoped options on the individual object. See Examples for usage.

Option Scope Required Applies to Description
site_urls Pipeline Yes All tables One or more verified Google Search Console property URLs to ingest (for example, https://example.com/ or sc-domain:example.com). Each URL must be a property verified in Google Search Console.
start_date Pipeline No All incremental tables (search_analytics_*, hourly_search_analytics_*) Earliest date from which to ingest data, in yyyy-MM-dd format. Defaults to 500 days before the first sync. Has no effect on sites or sitemaps.
data_state Table No Daily search performance tables only (search_analytics_*) Data freshness for daily search performance tables. all (default) includes finalized and fresh data. final includes finalized data only. Set it only on search_analytics_* objects. The sites, sitemaps, and hourly_search_analytics_* tables do not accept this option.

Create an ingestion pipeline

For the list of supported source tables, see Supported source tables.

Declarative Automation Bundles

Use Declarative Automation Bundles to manage Google Search Console pipelines as code. Bundles can contain YAML definitions of jobs and tasks, are managed using the Databricks CLI, and can be shared and run in different target workspaces (such as development, staging, and production). For more information, see What are Declarative Automation Bundles?.

  1. Create a bundle using the Databricks CLI:

    databricks bundle init
    
  2. Add two new resource files to the bundle:

    • A pipeline definition file (for example, resources/google_search_console_pipeline.yml). See pipeline.ingestion_definition and Examples.
    • A job definition file that controls the frequency of data ingestion (for example, resources/google_search_console_job.yml).
  3. Deploy the pipeline using the Databricks CLI:

    databricks bundle deploy
    

Databricks notebook

  1. Import the following notebook into your Azure Databricks workspace:

    Get notebook

  2. Leave cells one and two as they are. Do not modify.

  3. Modify cell three with your pipeline configuration details. See pipeline.ingestion_definition and Examples.

  4. Optionally configure advanced pipeline settings. See Common patterns for managed ingestion pipelines.

  5. Click Run all.

Examples

The Google Search Console connector makes available the following source tables under the default source schema:

Table type Tables
Site tables sites, sitemaps
Daily search performance report tables search_analytics_all_fields, search_analytics_by_country, search_analytics_by_date, search_analytics_by_device, search_analytics_by_page, search_analytics_by_query, search_analytics_page_report, search_analytics_site_report_by_page, search_analytics_site_report_by_site
Hourly search performance report tables hourly_search_analytics_page_report, hourly_search_analytics_site_report_by_page, hourly_search_analytics_site_report_by_site

For schema details, see Supported source tables.

Ingest a search performance report table

The following example ingests search_analytics_all_fields, which returns daily performance data aggregated on all five dimensions (date, country, device, page, query).

Declarative Automation Bundles

resources:
  pipelines:
    google_search_console_pipeline:
      name: google_search_console_pipeline
      catalog: 'main'
      target: 'google_search_console_data'
      ingestion_definition:
        connection_name: google_search_console_connection
        source_configurations:
          - api_source_connector_config:
              configs:
                site_urls: '["<site-url>"]'
                start_date: '<start-date>'
        objects:
          - table:
              source_schema: 'default'
              source_table: 'search_analytics_all_fields'
              destination_catalog: 'main'
              destination_schema: 'google_search_console_data'
              destination_table: 'search_analytics_all_fields'
              connector_options:
                api_source_connector_options:
                  options:
                    data_state: 'all'

Databricks notebook

pipeline_spec = {
  "name": "<pipeline-name>",
  "catalog": "<catalog-name-for-event-logs>",
  "schema": "<schema-name-for-event-logs>",
  "ingestion_definition": {
    "connection_name": "<connection-name>",
    "source_configurations": [
      {
        "api_source_connector_config": {
          "configs": {
            "site_urls": "[\"<site-url>\"]",
            "start_date": "<start-date>"
          }
        }
      }
    ],
    "objects": [
      {
        "table": {
          "source_schema": "default",
          "source_table": "search_analytics_all_fields",
          "destination_catalog": "<destination-catalog>",
          "destination_schema": "<destination-schema>",
          "destination_table": "search_analytics_all_fields",
          "connector_options": {
            "api_source_connector_options": {
              "options": {
                "data_state": "all"
              }
            }
          }
        }
      }
    ]
  }
}
json_payload = json.dumps(pipeline_spec, indent=2)
create_pipeline(json_payload)

Ingest a site table

The following example ingests sites, which returns metadata about your verified Google Search Console properties. Site tables are fully refreshed on every pipeline run, so start_date has no effect on them, and they do not accept data_state.

Declarative Automation Bundles

resources:
  pipelines:
    google_search_console_pipeline:
      name: google_search_console_pipeline
      catalog: 'main'
      target: 'google_search_console_data'
      ingestion_definition:
        connection_name: google_search_console_connection
        source_configurations:
          - api_source_connector_config:
              configs:
                site_urls: '["<site-url>"]'
        objects:
          - table:
              source_schema: 'default'
              source_table: 'sites'
              destination_catalog: 'main'
              destination_schema: 'google_search_console_data'
              destination_table: 'sites'

Databricks notebook

pipeline_spec = {
  "name": "<pipeline-name>",
  "catalog": "<catalog-name-for-event-logs>",
  "schema": "<schema-name-for-event-logs>",
  "ingestion_definition": {
    "connection_name": "<connection-name>",
    "source_configurations": [
      {
        "api_source_connector_config": {
          "configs": {
            "site_urls": "[\"<site-url>\"]"
          }
        }
      }
    ],
    "objects": [
      {
        "table": {
          "source_schema": "default",
          "source_table": "sites",
          "destination_catalog": "<destination-catalog>",
          "destination_schema": "<destination-schema>",
          "destination_table": "sites"
        }
      }
    ]
  }
}
json_payload = json.dumps(pipeline_spec, indent=2)
create_pipeline(json_payload)

Ingest site and search performance tables together

The following example combines a site table and a search performance report table in a single pipeline.

Declarative Automation Bundles

resources:
  pipelines:
    google_search_console_pipeline:
      name: google_search_console_pipeline
      catalog: 'main'
      target: 'google_search_console_data'
      ingestion_definition:
        connection_name: google_search_console_connection
        source_configurations:
          - api_source_connector_config:
              configs:
                site_urls: '["<site-url>"]'
                start_date: '<start-date>'
        objects:
          # sites does not accept data_state, so it has no connector_options block.
          - table:
              source_schema: 'default'
              source_table: 'sites'
              destination_catalog: 'main'
              destination_schema: 'google_search_console_data'
              destination_table: 'sites'
          - table:
              source_schema: 'default'
              source_table: 'search_analytics_by_page'
              destination_catalog: 'main'
              destination_schema: 'google_search_console_data'
              destination_table: 'search_analytics_by_page'
              connector_options:
                api_source_connector_options:
                  options:
                    data_state: 'final'

Databricks notebook

pipeline_spec = {
  "name": "<pipeline-name>",
  "catalog": "<catalog-name-for-event-logs>",
  "schema": "<schema-name-for-event-logs>",
  "ingestion_definition": {
    "connection_name": "<connection-name>",
    "source_configurations": [
      {
        "api_source_connector_config": {
          "configs": {
            "site_urls": "[\"<site-url>\"]",
            "start_date": "<start-date>"
          }
        }
      }
    ],
    "objects": [
      {
        "table": {
          "source_schema": "default",
          "source_table": "sites",
          "destination_catalog": "<destination-catalog>",
          "destination_schema": "<destination-schema>",
          "destination_table": "sites"
        }
      },
      {
        "table": {
          "source_schema": "default",
          "source_table": "search_analytics_by_page",
          "destination_catalog": "<destination-catalog>",
          "destination_schema": "<destination-schema>",
          "destination_table": "search_analytics_by_page",
          "connector_options": {
            "api_source_connector_options": {
              "options": {
                "data_state": "final"
              }
            }
          }
        }
      }
    ]
  }
}
json_payload = json.dumps(pipeline_spec, indent=2)
create_pipeline(json_payload)

Declarative Automation Bundles job definition file

The following is an example job definition file for use with Declarative Automation Bundles. The job runs daily.

Declarative Automation Bundles

resources:
  jobs:
    google_search_console_job:
      name: google_search_console_job
      schedule:
        quartz_cron_expression: '0 0 0 * * ?'
        timezone_id: 'UTC'
      tasks:
        - task_key: google_search_console_ingestion
          pipeline_task:
            pipeline_id: ${resources.pipelines.google_search_console_pipeline.id}

Common patterns

For advanced pipeline configurations, see Common patterns for managed ingestion pipelines.

Next steps

Start, schedule, and set alerts on your pipeline. See Common pipeline maintenance tasks.

Additional resources