Google bigquery 如何从BigQueryAPI获取列名?

Google bigquery 如何从BigQueryAPI获取列名?,google-bigquery,Google Bigquery,我可以使用以下代码获取列值: 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(que

我可以使用以下代码获取列值:

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))
但如最后一行所示,这需要直接列名。现在我有了多个查询,我想在一个look中运行它们并显示结果。是否有类似于
.format(row.column1,row.column2…)
的方法?此外,查询的结果列数不同

非常感谢您的帮助。

对于每个BigQuery,您可以按如下方式循环行对象,而无需指定确切的列名:

查询作业中的行:#API请求-获取结果 #行值可以通过字段名或索引访问 断言行[0]==行。名称==行[“名称”] 打印(行) 此外,您始终可以使用中所述的

这是一个使用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

您还可以将for循环中的行强制转换为dict(通过
dict(行)
)。然后键就是列名,你可以用字典做任何你能做的事情——迭代键(列名)、值(列值)或两者,无需事先明确知道列名。

谢谢您的回复,但我还是有点困惑:1)我可以使用嵌套循环使用索引打印所有列。如果我也想打印列名,怎么做?似乎
row.name
row[“name”]
仍然需要精确的字段名。。。。2) 似乎
schema
仅适用于表,我是否必须将查询结果存储在临时表中?对不起,如果我误解了什么…谢谢你的详细例子。我想做的是使用一个变量来代替确切的字段名。像
print(“{0}作为{2},{1}作为{3}”).format(行[0],行[1],字段名称[0],字段名称[1])
…我更新了我的答案,以帮助您获得架构字段,并且还为您提供了一些有关如何检查
查询作业的想法,如果您还需要其他内容的话。我相信这将有助于您打印现有数据asked@user2894829希望我的努力对你有用,你解决了你的问题。如果你能接受我的答案,我将不胜感激。如果适用,请投赞成票。谢谢你详细的回答和耐心。它是有效的,我已经接受了。最后一个问题是……我没有在API文档中找到任何类似
query\u job.\u query\u results.\u properties['schema']['fields'][0]['name']
的示例,您如何知道这种用法?阅读源代码?
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