如何从BigQuery API获取列名?动态处理多查询结果列输出
通用处理不同列数的BigQuery查询结果
这问题太实用了!批量跑不同查询还要手动写列名确实很繁琐,其实利用BigQuery Python客户端返回的Row对象的特性就能轻松解决,它本质上是类似字典的结构,支持动态获取列名和值。
给你几个实用的方案:
方案1:直接打印所有列的值(最简版)
如果只是想快速输出每行的所有值,不用关心列名对应,可以直接用row.values()获取所有列的值,再拼接成字符串:
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(", ".join(map(str, row.values())))
这个方法不管查询返回多少列都能自动适配,完全不用改代码。
方案2:按查询列顺序精准输出(更可控)
如果需要严格按照查询里的列顺序输出,或者后续要和列名对应处理,可以先从结果的schema里拿到列名列表,再动态取值:
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() # 从结果schema中提取所有列名,顺序和查询语句一致 column_names = [field.name for field in results.schema] for row in results: # 按列名顺序获取对应的值并转成字符串 row_values = [str(row[col_name]) for col_name in column_names] print(", ".join(row_values))
这个方案的好处是你可以随时扩展,比如要输出列名+值的格式,只需要改成:
print(" | ".join([f"{col}:{val}" for col, val in zip(column_names, row_values)]))
方案3:动态生成格式化字符串
如果你习惯用.format()的写法,也可以动态生成对应列数的格式字符串:
for row in results: # 根据列数生成对应的{}占位符 format_str = ", ".join(["{}"] * len(row)) # 用*解包row.values()传入format print(format_str.format(*row.values()))
原理和方案1一样,只是用了你熟悉的.format()语法,同样适配任意列数。
总结一下,核心就是利用Row对象的字典特性(支持row.values()、row[col_name])和结果集的schema属性,就能实现完全通用的批量查询结果处理,不用再为每个查询手动写列名啦!
内容的提问来源于stack exchange,提问作者user2894829
相关产品推荐
相关产品推荐

