[英]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_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”,“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.