2017-01-31 3 views
0

Я могу, например, получить данные BigQuery в локальный питона с:Получить BigQuery схему таблицы с помощью google.cloud

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'}]} 

ответ

1

Вы можете использовать метод schema из вашей resp переменных.

После выполнения запроса вы можете получить его:

schema = resp.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_type , fields, mode и name, так что если вы бежите:

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", "т", [Google схема 1, Google схема 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) и (надеюсь) вы хорошо идти.

Смежные вопросы