Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform 如何自动化BigQuery SQL管道_Google Cloud Platform_Google Bigquery_Google Cloud Dataflow - Fatal编程技术网

Google cloud platform 如何自动化BigQuery SQL管道

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选项可用于自动化

我使用BigQuerySQL创建了一个数据管道。 它首先从云存储导入一个CSV文件,然后进行不同的分析,包括使用BigQueryML进行预测建模 使用地理功能进行地理计算,以及 使用解析函数进行KPI计算

我能够成功地手动运行不同的查询,现在我想自动化数据管道

我的第一个选择是DataflowSQL,但事实证明DataflowSQL查询语法不支持地理函数

由于完整的分析是在SQL中完成的,所以DataflowPython不是一个选项,我希望保持这种方式


我的问题是,还有哪些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个查询:

  • 第一个从公共表中读取,然后写入项目中的另一个表
  • 第二个查询读取在第一个查询中创建的表,并根据日期列选择最新的10000行。之后,它会将结果保存到项目中的表中
  • 第三个函数读取步骤2中创建的表并计算一些聚合。之后,它会将结果保存到项目中的另一个表中

    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