我有一个大型数据库,正在尝试借助 python 和 bigquery API 进行查询。
但问题是它返回一个列表列表,并且我在展平结果方面遇到问题。
现在我正在这样做:
client = bigquery.Client.from_service_accoun_json('...')
query_job = client.query("""...""")
result = query_job.result()
从这里开始,我迷失了,列表可以从 1 级到 3-4 级不等,这使得搜索结果变得极其困难。
有没有一种有效的方法来平坦化结果?
最佳答案
当您说您的查询正在报告具有不同级别数的列表的列表时,我不太清楚您的意思。
在 BigQuery Python 客户端库中,query_job
是 google.cloud.bigquery.job.QueryJob
类型的对象。为了迭代结果,您只需在代码中添加一个循环,例如:
client = bigquery.Client()
query_job = client.query("...")
for row in query_job:
print(row)
每个 row
对象都包含从您运行的 BigQuery 查询返回的行之一。根据您使用的是标准 SQL 还是旧版 SQL,行格式会有所不同。标准 SQL 是从 BigQuery 查询数据的推荐和首选语言,但旧版 SQL 的特征之一是 it flattens query results automatically ,因此如果嵌套和重复字段对您来说是个问题,您可以使用它。否则,您可以flatten results in Standard SQL using the UNNEST
operator .
为了使用查询结果中的特定字段,您应该只使用 row
对象,如下所示:
- 对于“普通”字段:
row.field1
- 对于标准 SQL 中的嵌套字段:
row.parent[0]["child"]
- 对于旧版 SQL 中的嵌套字段:
row.parent_child
无论如何,通过打印 row
对象之一,您将看到可用字段以及如何迭代它们。一般来说,它们可以像普通的 Python 字典一样对待。
顺便说一句,为了将旧版 SQL 与 Python 客户端库一起使用(默认情况下使用标准 SQL),您只需添加一个 QueryJobConfig
参数,例如:
client = bigquery.Client()
job_config = bigquery.QueryJobConfig()
job_config.use_legacy_sql = True
query_job = client.query("...", job_config=job_config)
关于python - 如何在 python 中展平 google bigquery 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50702145/