Вы можете использовать метод 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)
и (надеюсь) вы хорошо идти.