【发布时间】:2018-12-03 02:44:05
【问题描述】:
我有一个要写入日期分区 BQ 表的数据框。我正在使用 to_gbq() 方法来执行此操作。我可以替换或追加现有表,但无法使用 to_gbq() 写入表的特定分区
【问题讨论】:
-
请分享您的代码,以及您遇到的错误。
我有一个要写入日期分区 BQ 表的数据框。我正在使用 to_gbq() 方法来执行此操作。我可以替换或追加现有表,但无法使用 to_gbq() 写入表的特定分区
【问题讨论】:
由于 to_gbq() 尚不支持它,我创建了一个代码 sn-p 用于使用 BigQuery API 客户端执行此操作。
假设您有一个像这样创建的现有date-partitioned 表:
CREATE TABLE
your_dataset.your_table (transaction_id INT64, transaction_date DATE)
PARTITION BY
transaction_date
你有一个像这样的 DataFrame:
import pandas
import datetime
records = [
{"transaction_id": 1, "transaction_date": datetime.date(2021, 10, 21)},
{"transaction_id": 2, "transaction_date": datetime.date(2021, 10, 21)},
{"transaction_id": 3, "transaction_date": datetime.date(2021, 10, 21)},
]
df = pandas.DataFrame(records)
以下是写入特定分区的方法:
from google.cloud import bigquery
client = bigquery.Client(project='your_project')
job_config = bigquery.LoadJobConfig(
# to append use "WRITE_APPEND" or don't pass job_config at all (appending is default)
write_disposition="WRITE_TRUNCATE",
)
# Include target partition in the table id:
table_id = "your_project.your_dataset.your_table$20211021"
job = client.load_table_from_dataframe(df, table_id, job_config=job_config) # Make an API request
job.result() # Wait for job to finish
重要的部分是表 id 中的$... 部分。它告诉 API 仅更新特定分区。如果您的数据包含属于不同分区的记录,则操作将失败。
【讨论】:
我相信分区表还不支持 to_gbq()。 你可以在这里查看最近的问题https://github.com/pydata/pandas-gbq/issues/43。
我建议使用 Google BigQuery API 客户端库https://googlecloudplatform.github.io/google-cloud-python/latest/bigquery/usage.html
您也可以将数据框上传到 BigQuery 表。 https://cloud.google.com/bigquery/docs/samples/bigquery-load-table-dataframe
【讨论】: