如何从 BigQuery API 获取列名?

Posted

技术标签:

【中文标题】如何从 BigQuery API 获取列名?【英文标题】:How to get column name from BigQuery API? 【发布时间】:2019-04-19 05:29:50 【问题描述】:

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

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】:

根据 BigQuery Python client documentation,您可以按如下方式循环遍历行对象,而无需指定确切的列名:

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 values,如answer 中所述

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

【讨论】:

感谢您的回复,但我还是有点困惑:1)我可以使用嵌套循环打印所有使用索引的列。如果我也想打印列名,该怎么做?似乎row.namerow["name"] 仍然需要确切的字段名称.... 2) 似乎schema 仅适用于表,我是否必须将查询结果存储在临时表中?对不起,如果我误解了什么...... 感谢您的详细示例。我想要做的是使用一个变量来代替确切的字段名称。喜欢print("0 AS 2, 1 AS 3".format(row[0], row[1], field_name[0], field_name[1])).... 我更新了我的答案以帮助您获取架构字段,并为您提供了一些有关如何检查 query_job 的想法(如果您需要其他任何内容)。我相信这现在应该可以帮助您按照您的要求打印数据 @user2894829 希望我的努力对您有用,并且您设法解决了您的问题。感谢您是否可以接受我的回答并在适用的情况下投票 感谢您的详细解答和耐心等待。它有效,我接受了。最后一个问题是……我在API文档中没有找到query_job._query_results._properties['schema']['fields'][0]['name']这样的例子,你是怎么知道这个用法的?阅读源代码?【参考方案2】:

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

【讨论】:

以上是关于如何从 BigQuery API 获取列名?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以从 Google BigQuery 中的特定表中获取列名吗?

使用应用程序脚本在 Big Query 中创建视图 |错误:对 bigquery.tables.insert 的 API 调用失败并出现错误:缺少必需的参数(第 21 行

如何从 bigquery nodejs api 获取整数?

查找要插入 BigQuery 的列名

如何从 BigQuery 表中提取所有列名的列表?

如何从 Bigquery Schema 中删除未使用的列名