Mat*_*ias 2 python google-bigquery
我有一个大型数据库,我试图在 python 和 bigquery API 的帮助下进行查询。
但问题是它返回一个列表列表,并且我在展平结果方面遇到问题。
现在我正在这样做:
client = bigquery.Client.from_service_accoun_json('...')
query_job = client.query("""...""")
result = query_job.result()
Run Code Online (Sandbox Code Playgroud)
从这里开始,我迷失了,列表可以从 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)
Run Code Online (Sandbox Code Playgroud)
每个row对象都包含从您运行的 BigQuery 查询返回的行之一。根据您使用的是标准 SQL 还是旧版 SQL,row格式会有所不同。标准 SQL 是从 BigQuery 查询数据的推荐和首选语言,但旧版 SQL 的特征之一是它会自动扁平化查询结果,因此如果嵌套和重复字段对您来说是个问题,您可以使用它。否则,您可以使用运算符展平标准 SQL 中的结果UNNEST。
为了使用查询结果中的特定字段,您应该按以下row方式使用该对象:
row.field1row.parent[0]["child"]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)
Run Code Online (Sandbox Code Playgroud)