json HTTP(仅)访问BigQuery插入所有记录格式错误

mbyulnm0  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(102)

使用:BigQuery InsertAll over HTTP
(客户端库不是选项-基于规则的案例管理系统-仅使用HTTP客户端)
这个身体:

{
  "rows": [
    {
      "insertId": 123456,
      "json": {
        "my_object": {
          "json": {
            "name": "Alice",
            "age": 30
          }
        }
      }
    }
  ],
  "traceId": "test"
}

字符串
我们得到这样的回应:

{
  "kind": "bigquery#tableDataInsertAllResponse",
  "insertErrors": [
    {
      "index": 0,
      "errors": [
        {
          "reason": "invalid",
          "location": "my_object",
          "debugInfo": "",
          "message": "This field: my_object is not a record."
        }
      ]
    }
  ]
}


在这里,我们尝试了my_object语法的许多变体。
对于此表结构:

... HTTP API调用的JSON主体中的JSON对象应该如何构造?
注意:我们可以为my_object提供文字值(标量字符串,数字等)-但这需要是JSON对象。
注意:有很多关于客户端库语法和对象设置的描述…但客户端库在此环境中不是一个选项。

disbfnqx

disbfnqx1#

对于您的要求,请考虑以下解决方法:

第一种解决方法(使用客户端库):

Python代码:

from google.cloud import bigquery
import json

client = bigquery.Client()
table_id = "my-project.my-dataset.my-table"

rows_to_insert = [
    {"my_object": json.dumps({'name':'uuu','no':98})}
]

errors = client.insert_rows_json(table_id, rows_to_insert)  
if errors == []:
    print("New rows have been added.")
else:
    print("Encountered errors while inserting rows: {}".format(errors))

字符串
有关详细信息,请参阅此link

第二种解决方法(使用云函数):

您可以考虑使用Google Cloud功能来满足您的需求。上面的代码稍加修改就可以在cloud函数中运行,我们可以使用http请求trigger cloud函数。我们可以通过http url发送json数据,然后我们可以在cloud函数中获取数据,然后我们可以将其插入到bigquery表中。
有关更多信息,请参阅此link

第三种解决方法(使用转义符和双引号,BigQuery InsertAll):

{
  "rows": [
    {
      "insertId": "00000",
      "json": {
        "my_object": "{\"name\":\"jjrr\",\"age\":100}"
      }
    }
  ]
}


JSON数据表示为带有转义字符和双引号的字符串。有关更多信息,您可以参考linklink2

结果:


的数据

相关问题