【问题标题】:replace bigquery partition with data staged in bigquery table using python使用 python 将 bigquery 分区替换为在 bigquery 表中暂存的数据
【发布时间】:2019-04-20 04:14:39
【问题描述】:

我在 bigquery 的每日分区表中暂存了 30 天的数据。我有一个更大的表,每天对 5 年的数据进行分区。我需要从暂存表中进行选择,并在我的暂存表中的 30 天内替换较大表中现有分区的全部内容。我的偏好是使用 Python 来执行此操作,而不是先将数据提取到 csv,然后如果可以避免的话,将其加载回 BQ。有什么建议?提前致谢。

【问题讨论】:

  • 你尝试了什么?出了什么问题?
  • 我通过提取到存储在云存储中的 csv 来工作,然后使用带有表名+分区的写入截断加载每个 csv(每日文件)。但是我必须从 BQ 中提取数据,将其存储在 GCS 中,然后再加载回 BQ,这似乎很疯狂。我正在寻找一种在 BQ 内完成这一切的方法,但没有找到任何关于这样做的方法的想法。

标签: python google-bigquery partition


【解决方案1】:

您需要做的就是查询您需要的内容并为您的查询设置目标表。

from google.cloud import bigquery
client = bigquery.Client()
query = """\
SELECT firstname + ' ' + last_name AS full_name,
       FLOOR(DATEDIFF(CURRENT_DATE(), birth_date) / 365) AS age
 FROM dataset_name.persons
"""
dataset = client.dataset('dataset_name')
table = dataset.table(name='person_ages')
job = client.run_async_query('fullname-age-query-job', query)
job.destination = table
job.write_disposition= 'truncate'
job.begin()

【讨论】:

  • 这实际上对我不起作用,但我认为它是正确的,尽管它适用于旧版本的大查询客户端库。您的回答确实有很大帮助,我会接受。我正在使用最新的库。福利
【解决方案2】:

这实际上对我不起作用,但我认为它是正确的,尽管它适用于旧版本的大型查询客户端库。您的回答确实有很大帮助,我会接受。我正在使用最新的库。以下对我有用:

for partition in gbq.list_partitions(stage_table_ref):
    table_partition = table_name+'$'+partition
    stage_partition = stage_dataset.table(table_partition)
    target_partition = target_dataset.table(table_partition)
    job_config = bigquery.CopyJobConfig()
    job_config.write_disposition = bigquery.WriteDisposition.WRITE_TRUNCATE   
    gbq.copy_table(stage_partition, target_partition,job_config = job_config) 

【讨论】:

    猜你喜欢
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多