如何在bigquery中转储内容未知的json?

问题描述 投票:0回答:2

我想在大型查询中插入json字段。典型的json是来自我们网页上所有不同API请求的请求有效负载。因此,典型的json可以具有不同的结构和大小。因此,我无法决定将json的架构作为Big Query中的RECORD字段插入。两个这样的json的示例是:

JSON1 = {
"key": "abcd",
"user_id": "1234FGH",
"start": 5,
"end": 10
}
JSON2 = {
"key": "efgh",
"creator_id": "789HIJ",
"content_id": "5678XYZ",
"from": 5,
"size": 10
}

显然,这些json的结构不同。我有数百个API的有效负载,每个API的请求json中都有数百个字段,因此我无力为BigQuery中的Record字段创建架构。

这是我的python代码:

import os

from google.cloud import bigquery

BIG_Q_CREDENTIALS = os.environ.get("GOOGLE_BIGQ_CREDENTIALS")
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = BIG_Q_CREDENTIALS

TABLE_ID = os.environ.get("BIGQ_TABLE_ID")
DATASET_ID = os.environ.get("BIGQ_DATASET_ID")

bigquery_client = bigquery.Client()
dataset_ref = bigquery_client.dataset(DATASET_ID)
table_ref = dataset_ref.table(TABLE_ID)

try:
    table = bigquery_client.get_table(table_ref)
except Exception as e:
    schema = [
                bigquery.SchemaField("event_name", "STRING", mode="REQUIRED"),
                bigquery.SchemaField("uuid", "STRING", mode="REQUIRED"),
                bigquery.SchemaField("request_payload", "RECORD", mode="NULLABLE"),
                bigquery.SchemaField("createdtime", "TIMESTAMP", mode="REQUIRED"),
            ]
    table = bigquery.Table(table_ref, schema=schema)
    table = bigquery_client.create_table(table)

代码错误出在:

google.api_core.exceptions.BadRequest: 400 POST https://bigquery.googleapis.com/bigquery/v2/projects/{PROJECT_ID}/datasets/{DATASET_NAME}/tables: Field request_payload is type RECORD but has no schema

我应该将此有效负载转储为字符串吗?但是我担心的是,查询在经济上会很昂贵。

任何帮助将不胜感激。如果您从头到尾都需要帮助您解决此问题,请告诉我。

python-3.x google-bigquery
2个回答
0
投票

作为错误消息中的状态

字段request_payload为RECORD类型,但没有模式

这意味着您需要将模式添加到REPEATED字段。

您可以在此answer中找到如何执行此操作


0
投票

因此,我无法确定将JSON作为大查询中的“记录”字段。

这是可以理解的。 JSON的常见用例是它很灵活。

RECORD is like a Struct,因此您需要预先指定字段,每个字段都具有类型(必填)和字段名称(可选)。这就是为什么您应该使用STRING代替的原因:bigquery.SchemaField("request_payload", "STRING", mode="NULLABLE"),并且每当您想从有效负载中读取时,都可以使用JSON_EXTRACT并获取所需的字段。

例如,您将通过运行以下查询获得user_id:

SELECT *, JSON_EXTRACT(request_payload, "$.user_id") FROM `Project.Dataset.Table`
© www.soinside.com 2019 - 2024. All rights reserved.