在BigQuery中可以将数据从一个表原子地移动到另一个表吗?

问题描述 投票:0回答:1

在BQ中,有什么方法可以将数据从一个表移动到另一个表?

我的案例:我有一些数据不断地被丢进一个非分区表,由一个我不控制的进程创建。这个表变得非常大,变得很难有效查询,所以我想对它进行分区。要做到这一点,我可以使用气流来重复地进行 SELECT INTO ... 并复制到一个相同的被分区的表中。然后把我从源表中复制的数据删除,这样做是有意义的,因为不需要这些数据,而且使以后的SELECT INTO的成本更高。

到目前为止,我已经有了一个单独的 SELECT INTO ... 随后 DELETE FROM ... 但我想知道是否有一些东西可以更原子化地工作,只是移动数据。

另一个解决方案可能是在预先存在的表上添加分区,但我没有看到任何东西表明这是可行的。

我研究了BQ的MERGE INTO,但似乎不能用它从源表中删除。

谢谢你

google-bigquery etl
1个回答
0
投票

你可以考虑使用 排程查询,它允许根据你的需要安排你的查询在一个时间间隔内运行。这也是对分区表的巨大贡献,因为它允许你 修剪查询 并提高其性能,降低成本。

我想到的另一个可能的解决方案是 运行中的工作 编程,即通过使用 Python代码. 不能使用相同的作业 ID 重新运行作业。相反,您需要创建一个具有相同配置的新作业。

最后,它是 Cloud Composer 的完美场景,使用了 大查询操作者. 您可以设置运行管道的时间表(例如,每天一次)。

from airflow import macros
from airflow import models
import datetime
from airflow.contrib.operators.bigquery_operator import BigQueryOperator

yesterday = datetime.datetime.combine(
    datetime.datetime.today() - datetime.timedelta(1),
    datetime.datetime.min.time())

default_args = {
            "start_date": yesterday,
            "retries": 1,
            "email_on_failure": False,
            "email_on_retry": False,
            "email": "[email protected]"
}

with models.DAG(
    'copy_bq_data', 
    schedule_interval=datetime.timedelta(days=1), 
    default_args=default_args) as dag:

    BQ_PROJECT = "my-bq-project"
    BQ_DATASET = "my-bq-dataset"

    # Task 1: create a partition table
    creating_partition_table = BigQueryOperator(
        task_id='bq_write',    
        sql='''
        #standardSQL
        SELECT
          ...
        ''',
        destination_dataset_table='{0}.{1}.daily_metrics'.format(
            BQ_PROJECT, BQ_DATASET)
        ),    
        write_disposition='WRITE_TRUNCATE',
        allow_large_results=True,
        use_legacy_sql=False,
        dag=dag
        task_id="display"
    )


    # Task 2: remove data from source table
    remove_data_from_table = BigQueryOperator(
        task_id='bq_remove',    
        sql='''
        #standardSQL
        DELETE 
        FROM 
          `source_table` 
        WHERE TRUE
        '''
        ),
        use_legacy_sql=False,
        dag=dag
    )

    creating_partition_table >> remove_data_from_table

此外,请看以下内容 Stackoverflow主题. 希望以上信息对你有用。

© www.soinside.com 2019 - 2024. All rights reserved.