无法将数据插入现有 BigQuery 表?

Posted

技术标签:

【中文标题】无法将数据插入现有 BigQuery 表?【英文标题】:Unable to insert data into existing BigQuery Table? 【发布时间】:2019-08-26 13:33:51 【问题描述】:

我正在尝试将一些数据插入到已经存在的 bigquery 表中。但我无法将该数据放入表中。

我尝试了 google (insert_rows) 提供的标准示例,但没有成功。我也提到了这个:https://github.com/googleapis/google-cloud-python/issues/5539 我也尝试过将此数据作为元组列表传递,但也存在同样的问题。

from google.cloud import bigquery
import datetime
bigquery_client = bigquery.Client()
dataset_ref = bigquery_client.dataset('my_dataset_id')
table_ref = dataset_ref.table('my_destination_table_id')
table = bigquery_client.get_table(table_ref)
rows_to_insert = [
    u'jobName': 'writetobigquery',
    u'startDatetime': datetime.datetime.now().strftime('%Y-%m-%d-%H%M%S'),
    u'jobStatus': 'Success',
    u'logMessage': 'NA',
]
errors = bigquery_client.insert_rows(table, rows_to_insert)

执行此操作时,我没有收到错误消息,但它没有将任何内容写入表中。如果有人建议对我有用的东西,那就太好了。谢谢!

【问题讨论】:

我运行了你提供的 sn-p,它对我来说很好用。唯一的问题是它插入了 4 个不同的行,每行只有一个值。您的表是否已使用正确的架构创建?您是否查询了该表并且它没有返回任何结果? Python 2.7?是新开发还是更新? @itroulli 该表已经使用正确的架构创建,在 sn-p 上运行后,我正在查询该表,但它没有返回任何数据作为结果。 @guillaumeblaquiere 是的,我正在使用 python 2.7(更新) 您是否正在执行查询以查找数据?还是您使用免费预览版? 【参考方案1】:

对您的代码进行一些修改后,我可以使其按预期工作。我将您的行从一个值的字典列表更改为一个所有列都在一行中的字典。我还更改了日期时间格式,因为它对 BigQuery 无效(可以找到有效格式 here)。所以下面的 sn-p 应该可以正常工作:


from google.cloud import bigquery
import datetime

bigquery_client = bigquery.Client()
dataset_ref = bigquery_client.dataset('my_dataset_id')
table_ref = dataset_ref.table('my_destination_table_id')
table = bigquery_client.get_table(table_ref)
rows_to_insert = [
    u'jobName': 'writetobigquery',
    u'startDatetime': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
    u'jobStatus': 'Success',
    u'logMessage': 'NA'
]
errors = bigquery_client.insert_rows(table, rows_to_insert)
print "Errors occurred:", errors

【讨论】:

@KaustubhGhole 您能否接受(并且可能赞成)我的答案是正确的,因为它对您有用? 我做到了,但由于我是 *** 的新手并且声誉低于 15,尽管它已记录但未公开显示。以下是来自 *** 的消息:“感谢您的反馈!声望低于 15 人的投票将被记录,但不要更改公开显示的帖子得分。” @KaustubhGhole 不用担心赞成票,但即使您是新手,也可以肯定地批准它。我的答案旁边应该有一个绿色的复选标志,您可以单击它。检查这个here。【参考方案2】:

您的行不应该是字典列表吗?我假设您的表架构类似于jobName, startDatetime, jobStatus, logMessage,那么:

rows_to_insert = [
    
      u'jobName': 'writetobigquery',
      u'startDatetime': datetime.datetime.now().strftime('%Y-%m-%d-%H%M%S'),
      u'jobStatus': 'Success',
      u'logMessage': 'NA'
    
]
errors = bigquery_client.insert_rows(table, rows_to_insert)

【讨论】:

@khan 我尝试了你的方法,但它没有返回任何东西。查询 (SELECT * FROM project_id.dataset_id.table_id) 结果为:“此查询未返回任何结果。”

以上是关于无法将数据插入现有 BigQuery 表?的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 从现有表插入分区表

查找要插入 BigQuery 的列名

BigQuery:将表插入到具有分片表的现有 Google 分析中

在 bigquery 中以编程方式更新/插入数据

如何使用bigquery流将嵌套数据插入现有记录

Bigquery:检查流期间的重复项