Python 正在将JSON上载到Bigquery非特定错误
我刚刚开始使用PythonBigQueryAPI,之前我曾短暂尝试并意识到pandas gbq不支持记录类型,即没有嵌套字段 现在我尝试将嵌套数据上传到BigQuery。我设法用各自的模式创建了表,但是我正在努力上传json数据Python 正在将JSON上载到Bigquery非特定错误,python,json,google-bigquery,Python,Json,Google Bigquery,我刚刚开始使用PythonBigQueryAPI,之前我曾短暂尝试并意识到pandas gbq不支持记录类型,即没有嵌套字段 现在我尝试将嵌套数据上传到BigQuery。我设法用各自的模式创建了表,但是我正在努力上传json数据 from google.cloud import bigquery from google.cloud.bigquery import Dataset from google.cloud.bigquery import LoadJobConfig from google
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读取数据时出错,错误消息:遇到JSON表
太多的错误,放弃。行:1;错误:1。请检查一下房间
有关详细信息,请参阅错误流
除了让我有点难过的是它放弃了我:,显然错误描述并没有真正的帮助。。。
请在下面找到我是如何尝试上传JSON和sampledata的
job_config = bigquery.LoadJobConfig()
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON
with open('testjson.json', 'rb') as source_file:
job = client.load_table_from_file(
source_file,
table_ref,
location='US', # Must match the destination dataset location.
job_config=job_config) # API request
job.result() # Waits for table load to complete.
print('Loaded {} rows into {}:{}.'.format(
job.output_rows, dataset_id, table_id))
这是我的JSON对象
[{'test':'test','age':2,'address':[{'test':'hi','second':'hi2'}]
如果我没有弄错的话,JSON示例将非常好,因为这似乎是上传嵌套数据的唯一方法。我认为您的JSON内容应该是:
{'full_name':'test','age':2,'address':[{'test':'hi','second':'hi2'}]}
没有括号。作为使用命令行客户端的示例:
$ echo "{'full_name':'test','age':2,'address':[{'test':'hi','second':'hi2'}]}" \
> example.json
$ bq query --use_legacy_sql=false \
"CREATE TABLE tmp_elliottb.JsonExample (full_name STRING NOT NULL, age INT64 NOT NULL, address ARRAY<STRUCT<test STRING, second STRING>>);"
$ bq load --source_format=NEWLINE_DELIMITED_JSON \
tmp_elliottb.JsonExample example.json
$ bq head tmp_elliottb.JsonExample
+-----------+-----+--------------------------------+
| full_name | age | address |
+-----------+-----+--------------------------------+
| test | 2 | [{"test":"hi","second":"hi2"}] |
+-----------+-----+--------------------------------+
我认为您的JSON内容应该是:
{'full_name':'test','age':2,'address':[{'test':'hi','second':'hi2'}]}
没有括号。作为使用命令行客户端的示例:
$ echo "{'full_name':'test','age':2,'address':[{'test':'hi','second':'hi2'}]}" \
> example.json
$ bq query --use_legacy_sql=false \
"CREATE TABLE tmp_elliottb.JsonExample (full_name STRING NOT NULL, age INT64 NOT NULL, address ARRAY<STRUCT<test STRING, second STRING>>);"
$ bq load --source_format=NEWLINE_DELIMITED_JSON \
tmp_elliottb.JsonExample example.json
$ bq head tmp_elliottb.JsonExample
+-----------+-----+--------------------------------+
| full_name | age | address |
+-----------+-----+--------------------------------+
| test | 2 | [{"test":"hi","second":"hi2"}] |
+-----------+-----+--------------------------------+
我一直在使用相同的代码和共享的JSON内容复制您的场景,我怀疑问题只是您在引号或“”之间定义JSON内容,而它不应该具有那种格式 正确的格式是@ElliottBrossard在其回答中与您共享的格式:
{'full_name':'test', 'age':2, 'address': [{'test':'hi', 'second':'hi2'}]}
如果我使用testjson.json文件中的内容运行代码,我会将响应加载1行到我的_数据集:我的_表中,并将内容加载到表中。否则,根据您的问题和另一个答案中的注释,如果我使用下面您使用的格式,我将得到结果google.api_core.exceptions.BadRequest:400读取数据时出错,错误消息:JSON表遇到太多错误,放弃。行:1;错误:1。请查看错误流以了解更多详细信息
此外,您可以在BigQueryUI中的链接后转到Jobs页面https://bigquery.cloud.google.com/jobs/YOUR_PROJECT_ID,您将在那里找到有关失败加载作业的更多信息。例如,当我使用错误的JSON格式运行代码时,我得到的结果如下:
正如您将看到的,这里的错误消息更相关:
error message: JSON parsing error in row starting at position 0: Value encountered without start of object
它表示它找不到JSON对象的任何有效开始,即在对象的最开始处的括号{
TL;DR:删除JSON对象中的引号,加载作业应该就可以了。我一直在使用相同的代码和您共享的JSON内容复制您的场景,我怀疑问题只是您在引号或“”之间定义JSON内容,而它不应该具有那种格式 正确的格式是@ElliottBrossard在其回答中与您共享的格式:
{'full_name':'test', 'age':2, 'address': [{'test':'hi', 'second':'hi2'}]}
如果我使用testjson.json文件中的内容运行您的代码,我会将响应加载到我的_数据集:我的_表中1行,并将内容加载到表中。否则,我会根据您的问题和另一个答案中的注释使用下面的格式,得到结果google.api_core.exceptions.BadRequest:400读取数据时出错,错误消息:JSON表遇到太多错误,放弃。行:1;错误:1。有关详细信息,请查看错误流
此外,您可以在BigQueryUI中的链接后转到Jobs页面https://bigquery.cloud.google.com/jobs/YOUR_PROJECT_ID,您将在那里找到有关失败加载作业的更多信息。例如,当我使用错误的JSON格式运行您的代码时,我得到的结果如下:
正如您将看到的,这里的错误消息更相关:
error message: JSON parsing error in row starting at position 0: Value encountered without start of object
它表示它找不到JSON对象的任何有效开始,即在对象的最开始处的括号{
TL;DR:删除JSON对象中的引号,加载作业应该就可以了。thx对于响应,我尝试了您建议的方法,并不断遇到相同的错误。我尝试了各种引号排列,例如和,没有用。真的很奇怪……您删除了括号?并将每个JSON对象放在单独的一行上?确实,对于n这实际上只是一个测试JSON对象,因为我想在移动到实际数据之前让原型工作。我尝试过:{'full_name':'test','age':2,'address':[{'test':'hi','second':'hi2'}}以及{full_name:test,age:2,address:[{test test:hi,second:hi2}]}甚至添加了一个\n作为良好的度量{full_name:test,age:2,address:[{test hi second:hi2}}\n'并尝试了这个。检查作业信息以查看实际错误是什么…如果您有作业ID,请使用bq命令行并运行bq show-j。您也可以使用bq ls-j
列出最近的工作。还有一种方法可以查看Python客户端的加载错误,但我不知道该从何处查看。您可以传递-n选项以查看更多作业,例如,bq ls-j-all-n 1000以查看1000个作业。你也可以做一些类似于bq ls-j-all-n 1000 | grep FAILURE的事情来查看失败的部分。thx对于响应,我尝试了你建议的方法,并不断地在相同的错误上绊倒。我尝试了各种各样的引号排列,如和,但都没有用。真奇怪…你把支架拆了?并将每个JSON对象放在单独的一行上?确实如此,现在这真的只是一个测试JSON对象,因为我想在移动到实际数据之前让原型工作。我试过:{full_name':'test','age':2,'address':[{'test':'hi','second':'hi2'}}}}以及{full_name:test,age:2,address:[{test:hi,second:hi2}}甚至还添加了一个\n作为良好的度量,{full_name:test,age:2,address:[{test hi hi\检查作业信息以查看实际错误是什么……如果您有作业ID,请使用bq命令行并运行bq show-j。您还可以使用BQLS-j列出最近的作业。还有一种方法可以查看Python客户端的加载错误,但我不知道该从何处查看。您可以传递-n选项以查看更多作业,例如,bq ls-j-all-n 1000以查看1000个作业。你也可以做一些类似bq ls-j-all-n 1000 | grep FAILURE的事情来查看失败的部分。你真是个天才!Thx@dsesto,非常感谢:我很高兴我能帮助并澄清这个问题!下次一定要遵循前面答案中的所有步骤,因为@ElliottBrossard已经在他的答案中发布了正确的JSON格式;他确实做到了,我从回声中复制了这个部分,并把重点放在括号上。无论如何,谢谢你的帮助。知道吗,为什么我的作业失败了,尽管python API没有出现在列表中?在哪个列表中?它们不是通过提供的吗?不,它们不是。那里没有显示任何python作业。它们在运行bq ls-j-all时确实会出现,但在使用bq show-j显式查询它们时会产生错误[作业id是从bq ls-j-all获得的]你真是个天才!Thx@dsesto,非常感谢:我很高兴我能帮助并澄清这个问题!下次一定要遵循前面答案中的所有步骤,因为@ElliottBrossard已经在他的答案中发布了正确的JSON格式;他确实做到了,我从回声中复制了这个部分,并把重点放在括号上。无论如何,谢谢你的帮助。知道吗,为什么我的作业失败了,尽管python API没有出现在列表中?在哪个列表中?它们不是通过提供的吗?不,它们不是。那里没有显示任何python作业。它们在运行bq ls-j-all时确实会显示,但在使用bq show-j显式查询它们时会产生错误[job_id是从bq ls-j-all获得的]