在BQ中,有什么方法可以将数据从一个表移动到另一个表?
我的案例:我有一些数据不断地被丢进一个非分区表,由一个我不控制的进程创建。这个表变得非常大,变得很难有效查询,所以我想对它进行分区。要做到这一点,我可以使用气流来重复地进行 SELECT INTO ...
并复制到一个相同的被分区的表中。然后把我从源表中复制的数据删除,这样做是有意义的,因为不需要这些数据,而且使以后的SELECT INTO的成本更高。
到目前为止,我已经有了一个单独的 SELECT INTO ...
随后 DELETE FROM ...
但我想知道是否有一些东西可以更原子化地工作,只是移动数据。
另一个解决方案可能是在预先存在的表上添加分区,但我没有看到任何东西表明这是可行的。
我研究了BQ的MERGE INTO,但似乎不能用它从源表中删除。
谢谢你
你可以考虑使用 排程查询,它允许根据你的需要安排你的查询在一个时间间隔内运行。这也是对分区表的巨大贡献,因为它允许你 修剪查询 并提高其性能,降低成本。
我想到的另一个可能的解决方案是 运行中的工作 编程,即通过使用 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主题. 希望以上信息对你有用。