From 7c924f66efdf94d6698f2298627110f95f97a443 Mon Sep 17 00:00:00 2001 From: Dipannita Banerjee Date: Fri, 27 Aug 2021 15:10:57 +0000 Subject: [PATCH 1/2] fix: change terraform files --- .../_terraform/advertiser_declared_stats_pipeline.tf | 2 +- .../_terraform/advertiser_stats_pipeline.tf | 2 +- .../_terraform/advertiser_weekly_spend_pipeline.tf | 2 +- .../_terraform/campaign_targeting_pipeline.tf | 2 +- .../google_political_ads/_terraform/creative_stats_pipeline.tf | 2 +- datasets/google_political_ads/_terraform/geo_spend_pipeline.tf | 2 +- .../_terraform/google_political_ads_dataset.tf | 2 +- .../google_political_ads/_terraform/last_updated_pipeline.tf | 2 +- .../_terraform/top_keywords_history_pipeline.tf | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/datasets/google_political_ads/_terraform/advertiser_declared_stats_pipeline.tf b/datasets/google_political_ads/_terraform/advertiser_declared_stats_pipeline.tf index 3461293df..06b3353f5 100644 --- a/datasets/google_political_ads/_terraform/advertiser_declared_stats_pipeline.tf +++ b/datasets/google_political_ads/_terraform/advertiser_declared_stats_pipeline.tf @@ -20,7 +20,7 @@ resource "google_bigquery_table" "advertiser_declared_stats" { dataset_id = "google_political_ads" table_id = "advertiser_declared_stats" - description = "advertiser_declared_stats dataset" + description = "Certain California and New Zealand advertisers are required to submit additional data about themselves. The advertiser is responsible for the accuracy of this information, which Google has not confirmed. For California, this information is provided from our express notification process required for certain California advertisers, which is separate from our verification process. For New Zealand, this information is provided during our verification process." diff --git a/datasets/google_political_ads/_terraform/advertiser_stats_pipeline.tf b/datasets/google_political_ads/_terraform/advertiser_stats_pipeline.tf index c008e8444..fea68cc9b 100644 --- a/datasets/google_political_ads/_terraform/advertiser_stats_pipeline.tf +++ b/datasets/google_political_ads/_terraform/advertiser_stats_pipeline.tf @@ -20,7 +20,7 @@ resource "google_bigquery_table" "advertiser_stats" { dataset_id = "google_political_ads" table_id = "advertiser_stats" - description = "advertiser_stats dataset" + description = "This table contains the information about advertisers who have run an election ad on Google Ads Services with at least one impression. The table\u0027s primary key is advertiser_id. This table relates to the others in this dataset, with the following connections between columns: advertiser_id is referenced from: advertiser_weekly_spend.advertiser_id campaign_targeting.advertiser_id creative_stats.advertiser_id advertiser_name is referenced from: advertiser_weekly_spend.advertiser_name campaign_targeting.advertiser_name advertiser_id.advertiser_name" diff --git a/datasets/google_political_ads/_terraform/advertiser_weekly_spend_pipeline.tf b/datasets/google_political_ads/_terraform/advertiser_weekly_spend_pipeline.tf index 75a79d7e4..2596d8e77 100644 --- a/datasets/google_political_ads/_terraform/advertiser_weekly_spend_pipeline.tf +++ b/datasets/google_political_ads/_terraform/advertiser_weekly_spend_pipeline.tf @@ -20,7 +20,7 @@ resource "google_bigquery_table" "advertiser_weekly_spend" { dataset_id = "google_political_ads" table_id = "advertiser_weekly_spend" - description = "advertiser_weekly_spend dataset" + description = "This table contains the information for how much an advertiser spent on political ads during a given week. The table\u0027s primary key is advertiser_id, election_cycle, week_start_date" diff --git a/datasets/google_political_ads/_terraform/campaign_targeting_pipeline.tf b/datasets/google_political_ads/_terraform/campaign_targeting_pipeline.tf index 737460099..573939eb0 100644 --- a/datasets/google_political_ads/_terraform/campaign_targeting_pipeline.tf +++ b/datasets/google_political_ads/_terraform/campaign_targeting_pipeline.tf @@ -20,7 +20,7 @@ resource "google_bigquery_table" "campaign_targeting" { dataset_id = "google_political_ads" table_id = "campaign_targeting" - description = "campaign_targeting dataset" + description = "This table was deprecated and ad-level targeting information was made available in the `google_political_ads.creative_stats` BigQuery table, effective April 2020. This table contains the information related to ad campaigns run by advertisers." diff --git a/datasets/google_political_ads/_terraform/creative_stats_pipeline.tf b/datasets/google_political_ads/_terraform/creative_stats_pipeline.tf index 9b44ecf8a..1791159a6 100644 --- a/datasets/google_political_ads/_terraform/creative_stats_pipeline.tf +++ b/datasets/google_political_ads/_terraform/creative_stats_pipeline.tf @@ -20,7 +20,7 @@ resource "google_bigquery_table" "creative_stats" { dataset_id = "google_political_ads" table_id = "creative_stats" - description = "creative_stats dataset" + description = "This table contains the information for election ads that have appeared on Google Ads Services. Ad-level targeting data was added to this file in April 2020. ad_id is referenced from: campaign_targeting.ads_list Data that was previously available in the `google_political_ads.campaign_targeting` table has been deprecated and removed in favor of this table." diff --git a/datasets/google_political_ads/_terraform/geo_spend_pipeline.tf b/datasets/google_political_ads/_terraform/geo_spend_pipeline.tf index 05e113c77..f19214dd1 100644 --- a/datasets/google_political_ads/_terraform/geo_spend_pipeline.tf +++ b/datasets/google_political_ads/_terraform/geo_spend_pipeline.tf @@ -20,7 +20,7 @@ resource "google_bigquery_table" "geo_spend" { dataset_id = "google_political_ads" table_id = "geo_spend" - description = "geo_spend dataset" + description = "This table contains the information for how much is spent buying election ads on Google Ads Services. The data is aggregated by Congressional district. The primary key is state, congressional_district." diff --git a/datasets/google_political_ads/_terraform/google_political_ads_dataset.tf b/datasets/google_political_ads/_terraform/google_political_ads_dataset.tf index edac812af..8727b6317 100644 --- a/datasets/google_political_ads/_terraform/google_political_ads_dataset.tf +++ b/datasets/google_political_ads/_terraform/google_political_ads_dataset.tf @@ -18,7 +18,7 @@ resource "google_bigquery_dataset" "google_political_ads" { dataset_id = "google_political_ads" project = var.project_id - description = "google_political_ads" + description = "Overview: This dataset contains information on how much money is spent by verified advertisers on political advertising across Google Ad Services. In addition, insights on demographic targeting used in political ad campaigns by these advertisers are also provided. Finally, links to the actual political ad in the Google Transparency Report (https://transparencyreport.google.com/) are provided. Data for an election expires 7 years after the election. After this point, the data are removed from the dataset and are no longer available.\n\nUpdate frequency: Weekly\n\nDataset source: Transparency Report: Political Advertising on Google\n\nTerms of use:\n\nSee the GCP Marketplace listing for more details and sample queries: https://console.cloud.google.com/marketplace/details/transparency-report/google-political-ads\n\nFor more information see:\nThe Political Advertising on Google Transparency Report at\nhttps://transparencyreport.google.com/political-ads/home\n\nThe supporting Frequently Asked Questions at\nhttps://support.google.com/transparencyreport/answer/9575640?hl=en\u0026ref_topic=7295796" } output "bigquery_dataset-google_political_ads-dataset_id" { diff --git a/datasets/google_political_ads/_terraform/last_updated_pipeline.tf b/datasets/google_political_ads/_terraform/last_updated_pipeline.tf index 14c6eb3e4..372fce7d9 100644 --- a/datasets/google_political_ads/_terraform/last_updated_pipeline.tf +++ b/datasets/google_political_ads/_terraform/last_updated_pipeline.tf @@ -20,7 +20,7 @@ resource "google_bigquery_table" "last_updated" { dataset_id = "google_political_ads" table_id = "last_updated" - description = "last_updated dataset" + description = "This table contains the information of the latest updated date for the Political Ads report. All dates provided are per UTC time zone." diff --git a/datasets/google_political_ads/_terraform/top_keywords_history_pipeline.tf b/datasets/google_political_ads/_terraform/top_keywords_history_pipeline.tf index c6c24192f..5acf37b4f 100644 --- a/datasets/google_political_ads/_terraform/top_keywords_history_pipeline.tf +++ b/datasets/google_political_ads/_terraform/top_keywords_history_pipeline.tf @@ -20,7 +20,7 @@ resource "google_bigquery_table" "top_keywords_history" { dataset_id = "google_political_ads" table_id = "top_keywords_history" - description = "top_keywords_history dataset" + description = "The \u201cTop Keywords\u201d section of the US report was removed and updates to this table were terminated in December 2019. The table reflects historical data. This table contains the information for the top six keywords on which political advertisers have spent money during an election cycle. This data is only provided for US elections. The primary key is election_cycle, report_date." From 705d42bdc7702daea92f2787785a997e40f1ffa4 Mon Sep 17 00:00:00 2001 From: Dipannita Banerjee Date: Sun, 29 Aug 2021 14:26:14 +0000 Subject: [PATCH 2/2] feat: Onboard Advertiser Geo Spend under Google Political Ads dataset --- .../advertiser_geo_spend_pipeline.tf | 39 ++++ .../advertiser_geo_spend_dag.py | 174 +++++++++++++++++ .../advertiser_geo_spend/pipeline.yaml | 181 ++++++++++++++++++ 3 files changed, 394 insertions(+) create mode 100644 datasets/google_political_ads/_terraform/advertiser_geo_spend_pipeline.tf create mode 100644 datasets/google_political_ads/advertiser_geo_spend/advertiser_geo_spend_dag.py create mode 100644 datasets/google_political_ads/advertiser_geo_spend/pipeline.yaml diff --git a/datasets/google_political_ads/_terraform/advertiser_geo_spend_pipeline.tf b/datasets/google_political_ads/_terraform/advertiser_geo_spend_pipeline.tf new file mode 100644 index 000000000..c5ede9715 --- /dev/null +++ b/datasets/google_political_ads/_terraform/advertiser_geo_spend_pipeline.tf @@ -0,0 +1,39 @@ +/** + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +resource "google_bigquery_table" "advertiser_geo_spend" { + project = var.project_id + dataset_id = "google_political_ads" + table_id = "advertiser_geo_spend" + + description = "This file contains total US advertiser spend on political ads, per US state and the District of Columbia." + + + + + depends_on = [ + google_bigquery_dataset.google_political_ads + ] +} + +output "bigquery_table-advertiser_geo_spend-table_id" { + value = google_bigquery_table.advertiser_geo_spend.table_id +} + +output "bigquery_table-advertiser_geo_spend-id" { + value = google_bigquery_table.advertiser_geo_spend.id +} diff --git a/datasets/google_political_ads/advertiser_geo_spend/advertiser_geo_spend_dag.py b/datasets/google_political_ads/advertiser_geo_spend/advertiser_geo_spend_dag.py new file mode 100644 index 000000000..02d08539a --- /dev/null +++ b/datasets/google_political_ads/advertiser_geo_spend/advertiser_geo_spend_dag.py @@ -0,0 +1,174 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from airflow import DAG +from airflow.contrib.operators import gcs_to_bq, kubernetes_pod_operator + +default_args = { + "owner": "Google", + "depends_on_past": False, + "start_date": "2021-03-01", +} + + +with DAG( + dag_id="google_political_ads.advertiser_geo_spend", + default_args=default_args, + max_active_runs=1, + schedule_interval="@daily", + catchup=False, + default_view="graph", +) as dag: + + # Run CSV transform within kubernetes pod + advertiser_geo_spend_transform_csv = kubernetes_pod_operator.KubernetesPodOperator( + task_id="advertiser_geo_spend_transform_csv", + startup_timeout_seconds=600, + name="advertiser_geo_spend", + namespace="default", + image_pull_policy="Always", + image="{{ var.json.google_political_ads.container_registry.run_csv_transform_kub }}", + env_vars={ + "SOURCE_URL": "https://storage.googleapis.com/transparencyreport/google-political-ads-transparency-bundle.zip", + "SOURCE_FILE": "files/data.zip", + "FILE_NAME": "google-political-ads-transparency-bundle/google-political-ads-advertiser-geo-spend.csv", + "TARGET_FILE": "files/data_output.csv", + "TARGET_GCS_BUCKET": "{{ var.json.shared.composer_bucket }}", + "TARGET_GCS_PATH": "data/google_political_ads/advertiser_geo_spend/data_output.csv", + "PIPELINE_NAME": "advertiser_geo_spend", + "CSV_HEADERS": '["advertiser_id","advertiser_name","country","country_subdivision_primary","spend_usd","spend_eur","spend_inr","spend_bgn","spend_hrk","spend_czk","spend_dkk","spend_huf","spend_pln","spend_ron","spend_sek","spend_gbp","spend_nzd"]', + "RENAME_MAPPINGS": '{"Advertiser_ID" : "advertiser_id" ,"Advertiser_Name" : "advertiser_name" ,"Country" : "country" ,"Country_Subdivision_Primary" : "country_subdivision_primary" ,"Spend_USD" : "spend_usd" ,"Spend_EUR" : "spend_eur" ,"Spend_INR" : "spend_inr" ,"Spend_BGN" : "spend_bgn" ,"Spend_HRK" : "spend_hrk" ,"Spend_CZK" : "spend_czk" ,"Spend_DKK" : "spend_dkk" ,"Spend_HUF" : "spend_huf" ,"Spend_PLN" : "spend_pln" ,"Spend_RON" : "spend_ron" ,"Spend_SEK" : "spend_sek" ,"Spend_GBP" : "spend_gbp" ,"Spend_NZD" : "spend_nzd"}', + }, + resources={"request_memory": "2G", "request_cpu": "1"}, + ) + + # Task to load CSV data to a BigQuery table + load_advertiser_geo_spend_to_bq = gcs_to_bq.GoogleCloudStorageToBigQueryOperator( + task_id="load_advertiser_geo_spend_to_bq", + bucket="{{ var.json.shared.composer_bucket }}", + source_objects=[ + "data/google_political_ads/advertiser_geo_spend/data_output.csv" + ], + source_format="CSV", + destination_project_dataset_table="google_political_ads.advertiser_geo_spend", + skip_leading_rows=1, + write_disposition="WRITE_TRUNCATE", + schema_fields=[ + { + "name": "advertiser_id", + "type": "string", + "description": "Unique ID for an advertiser verified to run election ads on Google Ads Services.", + "mode": "nullable", + }, + { + "name": "advertiser_name", + "type": "string", + "description": "Name of the advertiser.", + "mode": "nullable", + }, + { + "name": "country", + "type": "string", + "description": 'The country where election ads were served specified in the ISO 3166-1 alpha-2 standard code. For example: "US" for United States.', + "mode": "nullable", + }, + { + "name": "country_subdivision_primary", + "type": "string", + "description": 'The primary subdivision of the country where election ads were served specified by the ISO 3166-2 standard code. For example: "US-CA" for California state in United States', + "mode": "nullable", + }, + { + "name": "spend_usd", + "type": "integer", + "description": "Total amount in USD spent on election ads in this region.", + "mode": "nullable", + }, + { + "name": "spend_eur", + "type": "integer", + "description": "Total amount in EUR spent on election ads in this region.", + "mode": "nullable", + }, + { + "name": "spend_inr", + "type": "integer", + "description": "Total amount in INR spent on election ads in this region.", + "mode": "nullable", + }, + { + "name": "spend_bgn", + "type": "integer", + "description": "Total amount in BGN spent on election ads in this region.", + "mode": "nullable", + }, + { + "name": "spend_hrk", + "type": "integer", + "description": "Total amount in HRK spent on election ads in this region.", + "mode": "nullable", + }, + { + "name": "spend_czk", + "type": "integer", + "description": "Total amount in CZK spent on election ads in this region.", + "mode": "nullable", + }, + { + "name": "spend_dkk", + "type": "integer", + "description": "Total amount in DKK spent on election ads in this region.", + "mode": "nullable", + }, + { + "name": "spend_huf", + "type": "integer", + "description": "Total amount in HUF spent on election ads in this region.", + "mode": "nullable", + }, + { + "name": "spend_pln", + "type": "integer", + "description": "Total amount in PLN spent on election ads in this region.", + "mode": "nullable", + }, + { + "name": "spend_ron", + "type": "integer", + "description": "Total amount in RON spent on election ads in this region.", + "mode": "nullable", + }, + { + "name": "spend_sek", + "type": "integer", + "description": "Total amount in SEK spent on election ads in this region.", + "mode": "nullable", + }, + { + "name": "spend_gbp", + "type": "integer", + "description": "Total amount in GBP spent on election ads in this region.", + "mode": "nullable", + }, + { + "name": "spend_nzd", + "type": "integer", + "description": "Total amount in NZD spent on election ads in this region.", + "mode": "nullable", + }, + ], + ) + + advertiser_geo_spend_transform_csv >> load_advertiser_geo_spend_to_bq diff --git a/datasets/google_political_ads/advertiser_geo_spend/pipeline.yaml b/datasets/google_political_ads/advertiser_geo_spend/pipeline.yaml new file mode 100644 index 000000000..4e90fcb58 --- /dev/null +++ b/datasets/google_political_ads/advertiser_geo_spend/pipeline.yaml @@ -0,0 +1,181 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +resources: + + - type: bigquery_table + # Required Properties: + table_id: advertiser_geo_spend + + # Description of the table + description: "This file contains total US advertiser spend on political ads, per US state and the District of Columbia." + +dag: + airflow_version: 1 + initialize: + dag_id: advertiser_geo_spend + default_args: + owner: "Google" + + # When set to True, keeps a task from getting triggered if the previous schedule for the task hasn’t succeeded + depends_on_past: False + start_date: "2021-03-01" + max_active_runs: 1 + schedule_interval: "@daily" + catchup: False + default_view: graph + + tasks: + - operator: "KubernetesPodOperator" + + # Task description + description: "Run CSV transform within kubernetes pod" + + args: + + task_id: "advertiser_geo_spend_transform_csv" + + startup_timeout_seconds: 600 + + # The name of the pod in which the task will run. This will be used (plus a random suffix) to generate a pod id + name: "advertiser_geo_spend" + + # The namespace to run within Kubernetes. Always set its value to "default" because we follow the guideline that KubernetesPodOperator will only be used for very light workloads, i.e. use the Cloud Composer environment"s resources without starving other pipelines. + namespace: "default" + + image_pull_policy: "Always" + + # Docker images will be built and pushed to GCR by default whenever the `scripts/generate_dag.py` is run. To skip building and pushing images, use the optional `--skip-builds` flag. + image: "{{ var.json.google_political_ads.container_registry.run_csv_transform_kub }}" + + # Set the environment variables you need initialized in the container. Use these as input variables for the script your container is expected to perform. + env_vars: + SOURCE_URL: "https://storage.googleapis.com/transparencyreport/google-political-ads-transparency-bundle.zip" + SOURCE_FILE: "files/data.zip" + FILE_NAME: "google-political-ads-transparency-bundle/google-political-ads-advertiser-geo-spend.csv" + TARGET_FILE: "files/data_output.csv" + TARGET_GCS_BUCKET: "{{ var.json.shared.composer_bucket }}" + TARGET_GCS_PATH: "data/google_political_ads/advertiser_geo_spend/data_output.csv" + PIPELINE_NAME: "advertiser_geo_spend" + CSV_HEADERS: >- + ["advertiser_id","advertiser_name","country","country_subdivision_primary","spend_usd","spend_eur","spend_inr","spend_bgn","spend_hrk","spend_czk","spend_dkk","spend_huf","spend_pln","spend_ron","spend_sek","spend_gbp","spend_nzd"] + RENAME_MAPPINGS: >- + {"Advertiser_ID" : "advertiser_id" ,"Advertiser_Name" : "advertiser_name" ,"Country" : "country" ,"Country_Subdivision_Primary" : "country_subdivision_primary" ,"Spend_USD" : "spend_usd" ,"Spend_EUR" : "spend_eur" ,"Spend_INR" : "spend_inr" ,"Spend_BGN" : "spend_bgn" ,"Spend_HRK" : "spend_hrk" ,"Spend_CZK" : "spend_czk" ,"Spend_DKK" : "spend_dkk" ,"Spend_HUF" : "spend_huf" ,"Spend_PLN" : "spend_pln" ,"Spend_RON" : "spend_ron" ,"Spend_SEK" : "spend_sek" ,"Spend_GBP" : "spend_gbp" ,"Spend_NZD" : "spend_nzd"} + + + # Set resource limits for the pod here. For resource units in Kubernetes, see https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-units-in-kubernetes + resources: + request_memory: "2G" + request_cpu: "1" + + - operator: "GoogleCloudStorageToBigQueryOperator" + description: "Task to load CSV data to a BigQuery table" + + args: + task_id: "load_advertiser_geo_spend_to_bq" + + # The GCS bucket where the CSV file is located in. + bucket: "{{ var.json.shared.composer_bucket }}" + + # The GCS object path for the CSV file + source_objects: ["data/google_political_ads/advertiser_geo_spend/data_output.csv"] + source_format: "CSV" + destination_project_dataset_table: "google_political_ads.advertiser_geo_spend" + + # Use this if your CSV file contains a header row + skip_leading_rows: 1 + + # How to write data to the table: overwrite, append, or write if empty + # See https://cloud.google.com/bigquery/docs/reference/auditlogs/rest/Shared.Types/WriteDisposition + write_disposition: "WRITE_TRUNCATE" + + # The BigQuery table schema based on the CSV file. For more info, see + # https://cloud.google.com/bigquery/docs/schemas. + # Always use snake_case and lowercase for column names, and be explicit, + # i.e. specify modes for all columns. + + schema_fields: + - name: "advertiser_id" + type: "string" + description: "Unique ID for an advertiser verified to run election ads on Google Ads Services." + mode: "nullable" + - name: "advertiser_name" + type: "string" + description: "Name of the advertiser." + mode: "nullable" + - name: "country" + type: "string" + description: "The country where election ads were served specified in the ISO 3166-1 alpha-2 standard code. For example: \"US\" for United States." + mode: "nullable" + - name: "country_subdivision_primary" + type: "string" + description: "The primary subdivision of the country where election ads were served specified by the ISO 3166-2 standard code. For example: \"US-CA\" for California state in United States" + mode: "nullable" + - name: "spend_usd" + type: "integer" + description: "Total amount in USD spent on election ads in this region." + mode: "nullable" + - name: "spend_eur" + type: "integer" + description: "Total amount in EUR spent on election ads in this region." + mode: "nullable" + - name: "spend_inr" + type: "integer" + description: "Total amount in INR spent on election ads in this region." + mode: "nullable" + - name: "spend_bgn" + type: "integer" + description: "Total amount in BGN spent on election ads in this region." + mode: "nullable" + - name: "spend_hrk" + type: "integer" + description: "Total amount in HRK spent on election ads in this region." + mode: "nullable" + - name: "spend_czk" + type: "integer" + description: "Total amount in CZK spent on election ads in this region." + mode: "nullable" + - name: "spend_dkk" + type: "integer" + description: "Total amount in DKK spent on election ads in this region." + mode: "nullable" + - name: "spend_huf" + type: "integer" + description: "Total amount in HUF spent on election ads in this region." + mode: "nullable" + - name: "spend_pln" + type: "integer" + description: "Total amount in PLN spent on election ads in this region." + mode: "nullable" + - name: "spend_ron" + type: "integer" + description: "Total amount in RON spent on election ads in this region." + mode: "nullable" + - name: "spend_sek" + type: "integer" + description: "Total amount in SEK spent on election ads in this region." + mode: "nullable" + - name: "spend_gbp" + type: "integer" + description: "Total amount in GBP spent on election ads in this region." + mode: "nullable" + - name: "spend_nzd" + type: "integer" + description: "Total amount in NZD spent on election ads in this region." + mode: "nullable" + + + graph_paths: + - "advertiser_geo_spend_transform_csv >> load_advertiser_geo_spend_to_bq"