BigQuery JSON模式验证

时间:2015-07-31 10:45:25

标签: python json validation google-bigquery

是否有任何工具可以针对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模式,必须检查。

4 个答案:

答案 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?

我知道这不是一个易于实现的解决方案,但是我想如果您对它进行足够的调整,它将很强大并且可以解决您的问题。随时询问我是否可以为您提供更多帮助...

检查有关架构https://cloud.google.com/bigquery/docs/schemas的更多信息

答案 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 日志中的容易出错的字段。