Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正在将JSON上载到Bigquery非特定错误_Python_Json_Google Bigquery - Fatal编程技术网

Python 正在将JSON上载到Bigquery非特定错误

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

我刚刚开始使用PythonBigQueryAPI,之前我曾短暂尝试并意识到pandas gbq不支持记录类型,即没有嵌套字段

现在我尝试将嵌套数据上传到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读取数据时出错,错误消息:遇到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获得的]