【问题标题】:How to create a date partitioned table while using a loadjob in google Bigquery?如何在 google Bigquery 中使用 loadjob 时创建日期分区表?
【发布时间】:2020-07-22 17:58:29
【问题描述】:

是否有人能够解释如何在使用 JobConfig 在 google Bigquery 中使用加载作业时创建日期分区表。

https://cloud.google.com/bigquery/docs/creating-column-partitions#creating_a_partitioned_table_when_loading_data

我看不懂文档,如果有人可以举例说明,那将非常有帮助。

编辑: 所以我想感谢@irvifa,我找到了对象,但我仍然无法创建 TimePartitioned 表,这是我尝试使用的代码。

import pandas
from google.cloud import bigquery


def load_df(self, df):
  project_id="ProjectID"
  dataset_id="Dataset"
  table_id="TableName"
  table_ref=project_id+"."+dataset_id+"."+table_id
  time_partitioning = bigquery.table.TimePartitioning(field="PartitionColumn")
  job_config = bigquery.LoadJobConfig(
                         schema="Schema",
                         destinationTable=table_ref
                         write_disposition="WRITE_TRUNCATE",
                         timePartitioning=time_partitioning
                         )
  Job = Client.load_table_from_dataframe(df, table_ref, 
                                         job_config=job_config)
  Job.result()

【问题讨论】:

    标签: python google-bigquery table-partitioning


    【解决方案1】:

    感谢 irvifa。

    我试图加载数据框并正在寻找 LoadJobConfig,但它非常相似。

    我会发布我的答案,以防有人需要 LoadJob 的任何示例。

    import pandas
    from google.cloud import bigquery
    
    
    def load_df(self, df):
      project_id="ProjectID"
      dataset_id="Dataset"
      table_id="TableName"
      table_ref=project_id+"."+dataset_id+"."+table_id
      time_partitioning = bigquery.table.TimePartitioning(field="PartitionColumn")
      job_config = bigquery.LoadJobConfig(
                             schema="Schema",
                             write_disposition="WRITE_TRUNCATE",
                             time_partitioning=time_partitioning
                             )
      Job = Client.load_table_from_dataframe(df, table_ref, 
                                             job_config=job_config)
      Job.result()
    

    【讨论】:

      【解决方案2】:

      我不知道它是否会有所帮助,但您可以使用以下示例加载带有分区的作业:

      from datetime import datetime, time
      from concurrent import futures
      import math
      from pathlib import Path
      from google.cloud import bigquery
      
      def run_query(self, query_job_config):
        time_partitioning = bigquery.table.TimePartitioning(field="partition_date")
        job_config = bigquery.QueryJobConfig()
        job_config.destination = query_job_config['destination_dataset_table']
        job_config.time_partitioning = time_partitioning
        job_config.use_legacy_sql = False
        job_config.allow_large_results = True
        job_config.write_disposition = 'WRITE_APPEND'
        sql = query_job_config['sql']
        query_job = self.client.query(sql, job_config=job_config)
        query_job.result()
      

      【讨论】:

      • 哦,我的朋友!你确实帮了我。惊人的!谢谢,我看到你在那里做了什么。我不知道如何创建时间分区对象。 time_partitioning = bigquery.table.TimePartitioning(field="partition_date") 做到了,我在我的 LoadJobConfig 中将它用于 timePartitioning 属性。工作:)
      • 您好@KishanKumar 很高兴为您提供帮助,您可以将此标记为答案吗?谢谢!
      • @irvifa 我以为我得到了输出,但它仍然创建了一个非分区表,我已经更新了问题,如果你认为你可以告诉我我现在做错了什么,我会标记它关闭。
      • 我认为它应该是 time_partitioning 而不是目标表的 timePartitioning 我认为它应该是destination_table_description。请参考googleapis.dev/python/bigquery/latest/generated/…
      • 呃!你是对的,我使用 timePartitioning 查看cloud.google.com/bigquery/docs/reference/rest/v2/…。我的错,再次感谢你。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      相关资源
      最近更新 更多