Bigquery(和pandas) - 确保数据插入一致性

时间:2017-12-11 14:16:19

标签: python pandas dataframe google-bigquery google-cloud-platform

在我的python项目中,我需要用关系数据框填充一个bigquery表。我从头开始创建一个新表并确保上传到它的第一个数据实际上已放入表中,我遇到了很多麻烦。

我已经阅读了页面https://cloud.google.com/bigquery/streaming-data-into-bigquery#dataconsistency,并且已经看到将insertId应用于插入查询可以解决问题,但由于我使用了pandas的数据帧,所以pandas的函数to_gbq- gbq包似乎非常适合这项任务。然而,当使用to_gbq函数并创建/替换新表时,有时(显然是随机的)第一个数据块不会写入表中。

有人知道如何确保将DataFrame完全插入到一个大型新创建的表中吗?感谢

1 个答案:

答案 0 :(得分:2)

我相信你遇到了https://github.com/pydata/pandas-gbq/issues/75。基本上,Pandas使用BigQuery流API将数据写入表中,但是流表API在创建表到工作开始时有延迟。

编辑 pandas-gbq版本0.3.0修复了此问题,方法是使用加载作业将数据帧上传到BigQuery而不是流式传输。

与此同时,我建议使用"加载作业"创建表。例如,使用google-cloud-bigquery包中的client.load_table_from_file方法。

from google.cloud.bigquery import LoadJobConfig
from six import StringIO

destination_table = client.dataset(dataset_id).table(table_id)
job_config = LoadJobConfig()
job_config.write_disposition = 'WRITE_APPEND'
job_config.source_format = 'NEWLINE_DELIMITED_JSON'
rows = []

for row in maybe_a_dataframe:
    row_json = row.to_json(force_ascii=False, date_unit='s', date_format='iso')
    rows.append(row_json)

body = StringIO('{}\n'.format('\n'.join(rows)))

client.load_table_from_file(
    body,
    destination_table,
    job_config=job_config).result()

编辑:对于包含非ASCII字符的列,此代码示例失败。见https://github.com/pydata/pandas-gbq/pull/108