[英]BigQuery JSON schema validation
是否有任何工具可以根据 BigQuery 架构验证 JSON 字符串? 我想将有效的加载到 BQ,并重新处理无效的。
我知道您可以使用(例如)python 的 jsonschema 针对标准 JSON 模式进行验证,BQ 模式是否有类似的东西?
Re Pentium10 的评论,我可以想象许多 ETL 场景,其中必须组装来自多个来源的数据,以便它与 BQ 模式匹配 - 目前我需要 2 个数据模式,一个 JSON 模式和一个 BQ 模式 - 我验证了JSON 模式,并希望这足以满足提交时的 BQ 模式。
具体来说:在这种情况下,我有一个来自 javascript 前端的 JSON,并作为字符串输入到 BQ 中。 我想处理这个字段,并将它作为一个表本身添加到BQ中,以便我可以搜索它。
JSON(或多或少)分为 2 个“模式”,但它的类型很差(即数字被视为字符串,长度为 1 的列表是字符串,而不是列表......)。 我想要一种快速的方法来查看一个字段是否会进入表中,我有一个 BQ 表模式似乎有点愚蠢,但无法对其进行验证 - 相反,我还必须为理想化的数据创建一个 JSON 模式和必须检查。
如果您在 JSON-schema ( http://json-schema.org/implementations.html ) 中重新表达您的架构,那么您应该能够使用他们列出的工具之一来进行验证。
我建议你使用你的 JSON 模式作为 Python 中的 JSON 对象,这样你可以尝试使用 BigQuery 的库来验证模式。
1 - 从 BigQuery 表中请求架构(然后应该动态实现):
from google.cloud import bigquery
client = bigquery.Client(project='your_project')
dataset_ref = client.dataset('your_dataset')
table_ref = dataset_ref.table('your_table_name')
table_helper = client.get_table(table_ref)
2 - 获取架构并将其格式化为 JSON,之后您应该能够比较两个架构。
您现在拥有的是一个包含 SchemaField() 的列表
your_schema = table_helper.schema
您可以尝试格式化列表,然后将其转储到 JSON 对象中...
formatted_list_schema = ["'{0}','{1}','{2}',{3},{4}".format(schema.name,schema.field_type,schema.mode,schema.description,schema.fields) for schema in table_helper.schema]
json_bq_schema = json.dumps(formatted_list_schema)
您可以尝试格式化该 BQ-JSON-Schema 以便像他们在这里做的那样进行比较: How to compare two JSON objects with the same elements in a different order equal?
我知道这不是一个容易实现的解决方案,但我想如果你把它调整得足够好,它会很健壮,可以解决你的问题。 随意问我是否可以帮助您更多...
如果不提供任何示例,很难回答,但您通常可以使用jsonschema 。
这是 YAML 中的元模式定义:
"$schema": http://json-schema.org/draft-07/schema
title: Metaschema for BigQuery fields definition schemas
description: "See also: https://cloud.google.com/bigquery/docs/schemas"
type: array
minItems: 1
uniqueItems: yes
items:
"$id": "#/items"
title: Single field definition schema
type: object
examples:
- name: Item_Name
type: STRING
mode: NULLABLE
description: Name of catalog item
- name: Item_Category
type: STRING
mode: REQUIRED
- name: Exchange_Rate
type: NUMERIC
additionalProperties: no
required:
- name
- type
properties:
name:
"$id": "#/items/properties/name"
title: Name of field
description: "See also: https://cloud.google.com/bigquery/docs/schemas#column_names"
type: string
minLength: 1
maxLength: 128
pattern: "^[a-zA-Z_]+[a-zA-Z0-9_]*$"
examples:
- Item_Name
- Exchange_Rate
description:
"$id": "#/items/properties/description"
title: Description of field
description: "See also: https://cloud.google.com/bigquery/docs/schemas#column_descriptions"
type: string
maxLength: 1024
type:
"$id": "#/items/properties/type"
title: Name of BigQuery data type
description: 'See also: https://cloud.google.com/bigquery/docs/schemas#standard_sql_data_types'
type: string
enum:
- INTEGER
- FLOAT
- NUMERIC
- BOOL
- STRING
- BYTES
- DATE
- DATETIME
- TIME
- TIMESTAMP
- GEOGRAPHY
mode:
"$id": "#/items/properties/mode"
title: Mode of field
description: 'See also: https://cloud.google.com/bigquery/docs/schemas#modes'
type: string
default: NULLABLE
enum:
- NULLABLE
- REQUIRED
- REPEATED
这是我能够从 GCP 文档生成的最精确的元模式。 但是,此处不支持结构和数组。
YAML 只是为了便于阅读,如果需要,您可以轻松地将其转换为 JSON。
假设上面的metaschema保存为“/path/to/metaschema.yaml”,用法如下:
import json
from pathlib import Path
import jsonschema
import yaml
metaschema = yaml.safe_load(Path("/path/to/metaschema.yaml").read_text())
schema = """[{"name": "foo", "type": "STRING"}]"""
schema = json.loads(schema)
jsonschema.validate(schema, metaschema)
上面的yaml
模块由PyYAML包提供。
如果schema
有效, jsonschema.validate()
函数将简单地通过。 否则,将抛出jsonschema.exceptions.ValidationError
并带有错误解释。
是使用 JSON 还是 YAML 以及如何存储和解析模式取决于您。
此外,是否将类型和模式的名称转换为大写/小写也取决于您。
这是我创建的实现之一。 https://github.com/toshi0607/bq-schema-validator
它有点模糊,但它通常会检测 JSON 日志中的容易出错的字段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.