繁体   English   中英

使用google.cloud获取BigQuery表架构

[英]Get BigQuery table schema using google.cloud

我可以通过以下方式将BigQuery数据导入本地python:

import os
from google.cloud import bigquery

project_id = "example-project"
dataset_id = "exapmle_dataset"
table_id = "table_id"

os.environ["GOOGLE_CLOUD_PROJECT"] = project_id
bq = bigquery.Client()

query = "SELECT * FROM {}.{} LIMIT 5".format(dataset_id, table_id)
resp = bq.run_sync_query(query)
resp.run()
data_list = resp.rows

结果:

print(data_list)
>>> [('BEDD', '1',), ('A75', '1',), ('CE3F', '1',), ('0D8C', '1',), ('3E9C', '1',)]

然后我如何去获取此表的架构? 例如,这样

headings = ('heading1', 'heading2')
# or
schema_dict = {'fields': [{'name': 'heading1', 'type': 'STRING'}, {'name': 'heading2', 'type': 'STRING'}]}

您可以使用resp变量中的schema方法。

运行查询后,您可以检索它:

schema = resp.schema

schema将是一个列表,其中包含查询中每列的定义。

举个例子,假设这是你的查询:

query = "select '1' as fv, STRUCT<i INT64, j INT64> (1, 2) t  from `dataset.table` limit 1"

架构将是包含2个条目的列表:

[<google.cloud.bigquery.schema.SchemaField at 0x7ffa64fe6e50>,
 <google.cloud.bigquery.schema.SchemaField at 0x7ffa64fe6b10>]

对于模式中的每个对象,您有方法field_typefieldsmodename因此如果您运行:

schema[0].field_type, schema[0].mode, schema[0].name

结果是“STRING”,“NULLABLE”,“fv”。

由于第二列是记录,因此如果您运行:

schema[1].field_type, schema[1].mode, schema[1].name, schema[1].fields

结果是:

“RECORD”,“NULLABLE”,“t”,[google schema 1,google schema 2]

google schema 1包含记录中内部字段的定义。

据我所知,你无法获得你在问题中显示的字典,这意味着你必须循环遍历schema的条目并自己构建它。 它应该很简单。 不确定这是否有效,因为我还没有完全测试它,但它可能会让你知道如何做到这一点:

def extract_schema(schema_resp):
    l = []
    for schema_obj in schema_resp:
        r = {}
        r['name'] = schema_obj.name
        r['type'] = schema_obj.field_type
        r['mode'] = schema_obj.mode
        if schema_obj.fields:
            r['fields'] = extract_schema(schema_obj.fields)
        l.append(r)
    return l

所以你只需要运行schema = extract_schema(resp.schema)并且(希望)你会好起来的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM