是否有任何工具可以针对BigQuery架构验证JSON字符串? 我想将有效的加载到BQ,并重新处理无效的。
我知道您可以使用(例如)python的jsonschema验证标准JSON模式,BQ模式是否有类似的东西?
Re Pentium10的评论,我可以想象一些ETL场景,其中来自多个源的数据必须被组装以使其与BQ架构匹配 - 目前我需要2个数据模式,JSON模式和BQ模式 - 我验证了JSON模式,并希望这足以满足提交时的BQ模式。
具体来说:在这种情况下,我有从Javascript前端到达的JSON,并作为字符串输入BQ。我想处理这个字段,并将它作为一个表单独添加到BQ中,以便我可以搜索它。
JSON(或多或少)属于2'模式',但是TYPED很差(即数字被视为字符串,长度为1的列表是字符串,而不是列表......)。我想快速查看一个字段是否会进入表中,我有一个BQ表模式似乎有点傻,但是无法验证它 - 相反,我还必须为理想化数据创建一个JSON模式,必须检查。
答案 0 :(得分:0)
如果您在JSON架构(http://json-schema.org/implementations.html)中重新表达架构,那么您应该能够使用它们列出的工具之一进行验证。
答案 1 :(得分:0)
我建议您将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?
我知道这不是一个易于实现的解决方案,但是我想如果您对它进行足够的调整,它将很强大并且可以解决您的问题。随时询问我是否可以为您提供更多帮助...
答案 2 :(得分:0)
没有提供任何示例就很难回答,但是通常可以使用jsonschema。
以下是YAML中的元模式定义:
data.clip(lower=0).resample("30min").sum()
这是我已经能够从GCP文档生成的最精确的元模式。不过,这里不支持结构和数组。
YAML仅出于可读性考虑,您可以根据需要轻松将其转换为JSON。
假设上面的元模式保存为“ /path/to/metaschema.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
PyYAML软件包提供了上方的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
有效,则schema
函数将简单地通过。否则,将抛出jsonschema.validate()
并给出错误说明。
由您决定使用JSON还是YAML以及如何存储和解析模式。
由您决定是否将类型和模式的名称转换为大写/小写。
答案 3 :(得分:0)
这是我创建的实现之一。 https://github.com/toshi0607/bq-schema-validator
有点模糊,但它通常会检测 JSON 日志中的容易出错的字段。