在短暂试用(https://github.com/pydata/pandas-gbq)并意识到pandas gbq不支持记录类型(即不支持嵌套字段)之后,我才开始使用python BigQuery API(https://github.com/GoogleCloudPlatform/google-cloud-python/tree/master/bigquery)。在
现在我尝试将嵌套数据上传到BigQuery。我设法用各自的模式创建了表,但是我在json数据的上传上遇到了困难。在
from google.cloud import bigquery
from google.cloud.bigquery import dataset
from google.cloud.bigquery import LoadJobConfig
from google.cloud.bigquery import SchemaField
SCHEMA = [
SchemaField('full_name', 'STRING', mode='required'),
SchemaField('age', 'INTEGER', mode='required'),
SchemaField('address', 'RECORD', mode='REPEATED', fields=(
SchemaField('test', 'STRING', mode='NULLABLE'),
SchemaField('second','STRING', mode='NULLABLE')
))
]
table_ref = client.dataset('TestApartments').table('Test2')
table = bigquery.Table(table_ref, schema=SCHEMA)
table = client.create_table(table)
当尝试将一个非常简单的JSON上传到bigquery时,我得到了一个相当模糊的错误
400 Error while reading data, error message: JSON table encountered too many errors, giving up. Rows: 1; errors: 1. Please look into the error stream for more details.
除了它放弃我让我有点难过之外,显然错误描述并没有真正的帮助。。。 下面是我如何上传JSON和sampledata的。在
^{pr2}$这是我的JSON对象
"[{'full_name':'test','age':2,'address':[{'test':'hi','second':'hi2'}]}]"
一个JSON示例将是非常棒的,因为如果我没弄错的话,这似乎是上传嵌套数据的唯一方法。在
我一直在使用相同的代码和共享的JSON内容来重现您的场景,我怀疑问题只是您在引号(})之间定义JSON内容,而它不应该有这种格式。在
"
或{正确的格式是@elliotbrossard在他的回答中已经与您分享的格式:
如果我在
^{pr2}$testjson.json
文件中使用该内容运行您的代码,我将得到响应Loaded 1 rows into MY_DATASET:MY_TABLE
,并将内容加载到表中。否则,如果我使用下面的格式(您根据您的问题和另一个答案中的注释使用该格式),我将得到结果google.api_core.exceptions.BadRequest: 400 Error while reading data, error message: JSON table encountered too many errors, giving up. Rows: 1; errors: 1. Please look into the error stream for more details
。在此外,您可以转到BigQuery UI中的Jobs页面(点击链接https://bigquery.cloud.google.com/jobs/YOUR_项目_ID),您将在那里找到有关失败加载作业的更多信息。例如,当我用错误的JSON格式运行代码时,我得到的结果是:
{a1}
如您所见,这里的错误消息更为相关:
它表示它找不到JSON对象的任何有效开头(即在对象的最开始处有一个括号
{
)。在TL;DR:删除JSON对象中的引号,加载作业应该没问题。在
我认为您的JSON内容应该是:
(无括号。)例如,使用命令行客户端:
^{pr2}$相关问题 更多 >
编程相关推荐