Google cloud platform 如何自动化BigQuery SQL管道
我使用BigQuerySQL创建了一个数据管道。 它首先从云存储导入一个CSV文件,然后进行不同的分析,包括使用BigQueryML进行预测建模 使用地理功能进行地理计算,以及 使用解析函数进行KPI计算 我能够成功地手动运行不同的查询,现在我想自动化数据管道 我的第一个选择是DataflowSQL,但事实证明DataflowSQL查询语法不支持地理函数 由于完整的分析是在SQL中完成的,所以DataflowPython不是一个选项,我希望保持这种方式Google cloud platform 如何自动化BigQuery SQL管道,google-cloud-platform,google-bigquery,google-cloud-dataflow,Google Cloud Platform,Google Bigquery,Google Cloud Dataflow,我使用BigQuerySQL创建了一个数据管道。 它首先从云存储导入一个CSV文件,然后进行不同的分析,包括使用BigQueryML进行预测建模 使用地理功能进行地理计算,以及 使用解析函数进行KPI计算 我能够成功地手动运行不同的查询,现在我想自动化数据管道 我的第一个选择是DataflowSQL,但事实证明DataflowSQL查询语法不支持地理函数 由于完整的分析是在SQL中完成的,所以DataflowPython不是一个选项,我希望保持这种方式 我的问题是,还有哪些GCP选项可用于自动化
我的问题是,还有哪些GCP选项可用于自动化数据管道。BigQuery有一个内置的调度机制,目前处于测试版功能中 要自动化BQ本机SQL管道,可以使用此实用程序。 使用CLI:
$ bq query \
--use_legacy_sql=false \
--destination_table=mydataset.mytable \
--display_name='My Scheduled Query' \
--replace=true \
'SELECT
1
FROM
mydataset.test'
正如我在评论中提到的,如果您需要协调您的查询,您可以使用
cloudcomposer
,这是一个完全受管理的气流
集群
我创建了下面的代码,或多或少地向您展示了如何使用此工具协调查询。请注意,这是一个基本代码,可以在编码标准方面进行改进。
代码基本上协调了3个查询:
import datetime
from airflow import models
from airflow.contrib.operators import bigquery_operator
"""The condiguration presented below will run your DAG every five minutes as specified in the
schedule_interval property starting from the datetime specified in the start_date property"""
default_dag_args = {
'start_date': datetime.datetime(2020, 4, 22, 15, 40),
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': datetime.timedelta(minutes=1),
'project_id': "<your_project_id>",
}
with models.DAG(
'composer_airflow_bigquery_orchestration',
schedule_interval = "*/5 * * * *",
default_args=default_dag_args) as dag:
run_first_query = bigquery_operator.BigQueryOperator(
sql = "SELECT * FROM `bigquery-public-data.catalonian_mobile_coverage.mobile_data_2015_2017`",
destination_dataset_table = "<your_project>.<your_dataset>.orchestration_1",
task_id = 'xxxxxxxx',
write_disposition = "WRITE_TRUNCATE",
#create_disposition = "",
allow_large_results = True,
use_legacy_sql = False
)
run_second_query = bigquery_operator.BigQueryOperator(
sql = "SELECT * FROM `<your_project>.orchestration_1` ORDER BY date LIMIT 10000 ",
destination_dataset_table = "<your_project>.<your_dataset>.orchestration_2",
task_id = 'yyyyyyyy',
write_disposition = "WRITE_TRUNCATE",
#create_disposition = "",
allow_large_results = True,
use_legacy_sql = False
)
run_third_query = bigquery_operator.BigQueryOperator(
sql = "SELECT round(lat) r_lat, round(long) r_long, count(1) total FROM`<your_project>.orchestration_2` GROUP BY r_lat,r_long",
destination_dataset_table = "<your_project>.<your_dataset>.orchestration_3",
task_id = 'zzzzzzzz',
write_disposition = "WRITE_TRUNCATE",
#create_disposition = "",
allow_large_results = True,
use_legacy_sql = False
)
# Define DAG dependencies.
run_first_query >> run_second_query >> run_third_query
default\u dag\u args
的dict,在创建dag时将进一步使用该dict
default_dag_args = {
'start_date': datetime.datetime(2020, 4, 22, 15, 40),
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': datetime.timedelta(minutes=1),
'project_id': "<your_project_id>",
}
最后,我想补充一点,讨论如何在使用CRON表达式时正确设置start_日期和schedule_间隔 你需要多复杂?您能简单地使用预定查询吗?如果您需要更高的复杂性,我会使用python,即使您的所有步骤都是函数式SQL,您也可以使用python来编排它们。就我个人而言,我发现对于我运行多个SQL查询的类似要求而言,数据流非常复杂且过于繁重。CRMint是一个很好的自动化SQL(和其他)作业的工具,也许这是一个很好的折衷方案?这是我们目前使用的一个很好的解决方案。基本上,您可以使用几乎纯SQL来编排数据管道。请查看Magnus——工作流自动机,它是套件的一部分——支持所有BigQuery、云存储和大多数Google API,以及多个简单实用程序类型的任务,如BigQuery任务、导出到存储任务、循环任务等,以及高级调度、触发、,等亦可于。披露:我是这些工具的创建者,也是Potens团队的领导者。如果您的查询像管道一样工作,换句话说,如果您需要完成一个查询来运行另一个查询,我建议您在云中查看。谢谢,您的示例非常有帮助。
default_dag_args = {
'start_date': datetime.datetime(2020, 4, 22, 15, 40),
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': datetime.timedelta(minutes=1),
'project_id': "<your_project_id>",
}
with models.DAG(
'composer_airflow_bigquery_orchestration',
schedule_interval = "*/5 * * * *",
default_args=default_dag_args) as dag:
run_first_query = bigquery_operator.BigQueryOperator(
sql = "SELECT * FROM `bigquery-public-data.catalonian_mobile_coverage.mobile_data_2015_2017`",
destination_dataset_table = "<your_project>.<your_dataset>.orchestration_1",
task_id = 'xxxxxxxx',
write_disposition = "WRITE_TRUNCATE",
#create_disposition = "",
allow_large_results = True,
use_legacy_sql = False
)
run_second_query = bigquery_operator.BigQueryOperator(
sql = "SELECT * FROM `<your_project>.orchestration_1` ORDER BY date LIMIT 10000 ",
destination_dataset_table = "<your_project>.<your_dataset>.orchestration_2",
task_id = 'yyyyyyyy',
write_disposition = "WRITE_TRUNCATE",
#create_disposition = "",
allow_large_results = True,
use_legacy_sql = False
)
run_third_query = bigquery_operator.BigQueryOperator(
sql = "SELECT round(lat) r_lat, round(long) r_long, count(1) total FROM`<your_project>.orchestration_2` GROUP BY r_lat,r_long",
destination_dataset_table = "<your_project>.<your_dataset>.orchestration_3",
task_id = 'zzzzzzzz',
write_disposition = "WRITE_TRUNCATE",
#create_disposition = "",
allow_large_results = True,
use_legacy_sql = False
)
run_first_query >> run_second_query >> run_third_query