Python 3.x 使用google.cloud获取BigQuery表架构

Python 3.x 使用google.cloud获取BigQuery表架构,python-3.x,google-bigquery,Python 3.x,Google Bigquery,例如,我可以使用以下方法将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 = "SELE

例如,我可以使用以下方法将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"
结果是“STRING”、“NULLABLE”、“fv”

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

schema[0].field_type, schema[0].mode, schema[0].name
schema[1].field_type, schema[1].mode, schema[1].name, schema[1].fields
结果是:

“记录”,“可空”,“t”,“谷歌模式1,谷歌模式2]

其中
googleschema 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\u schema(resp.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