Как получить имя столбца из BigQuery API? - PullRequest
0 голосов
/ 19 апреля 2019

Я могу получить значения столбцов, используя следующие коды:

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'C:\\Users\xxx\Desktop\key.json'
bq_client = Client()
query = "SELECT msts, coreuserid, spend_usd FROM `project.f_purchase` where dt = '2019-04-02' limit 5"
query_job = bq_client.query(query)
results = query_job.result()   

for row in results:
    print("{}, {}, {}".format(row.msts, row.uid, row.spend_amount))

Но, как показано в последней строке, для этого требуется прямое имя столбца.Теперь у меня есть несколько запросов, и я хочу запустить их в виде и отобразить результат.Есть ли способ, подобный .format(row.column1, row.column2...)?Кроме того, количество столбцов результатов различается для запросов.

Любая помощь приветствуется.

1 Ответ

2 голосов
/ 19 апреля 2019

За BigQuery Документация по клиенту Python Вы можете циклически перемещаться по объекту строки, как указано ниже, без указания точного имени столбца:

for row in query_job:  # API request - fetches results
    # Row values can be accessed by field name or index
    assert row[0] == row.name == row["name"]
    print(row)

Кроме того, вы всегда можете использовать значения SchemaField , как описано в этом ответе

result = ["{0} {1}".format(schema.name,schema.field_type) for schema in table.schema]

Это пример использования открытого набора данных BigQuery о том, как получить доступ к полям без указания имени поля:

from google.cloud import bigquery
from pprint import pprint
import json

client = bigquery.Client()

query = (
    "SELECT state,max(gender) as gender FROM `bigquery-public-data.usa_names.usa_1910_2013` "
    'GROUP BY state '
    "LIMIT 10"
)
query_job = client.query(
    query,
    # Location must match that of the dataset(s) referenced in the query.
    location="US",
)  # API request - starts the query

for num, row in enumerate(query_job, start=1):  # API request - fetches results
    # Row values can be accessed by field name or index
    # assert row[0] == row.name == row["name"]
    print("{} AS {}, {} AS {}".format(row[0], query_job._query_results._properties['schema']['fields'][0]['name'], row[1], query_job._query_results._properties['schema']['fields'][1]['name']))

    #print(row[0], row[1])

print(json.dumps(query_job._query_results._properties['schema']['fields'][0]['name']))
print(query_job._query_results._properties)
#pprint(vars(query_job._query_results._properties))

, который производит следующий вывод:

superQuery:bin tamirklein$ python test.py
AK AS state, M AS gender
AL AS state, M AS gender
AR AS state, M AS gender
AZ AS state, M AS gender
CA AS state, M AS gender
CO AS state, M AS gender
CT AS state, M AS gender
DC AS state, M AS gender
DE AS state, M AS gender
FL AS state, M AS gender
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...