我想在大型查询中插入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
我应该将此有效负载转储为字符串吗?但是我担心的是,查询在经济上会很昂贵。
任何帮助将不胜感激。如果您从头到尾都需要帮助您解决此问题,请告诉我。
因此,我无法确定将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`