从BigQuery将大量数据加载到Python

3
from google.cloud import bigquery as bq
import google_auth_oauthlib.flow

query = '''select ... from ...'''

bigquery_client = bq.Client()
table = bq.query.QueryResults(query=query,client=bigquery_client)
table.use_legacy_sql = False
table.run()

# transfer bigquery data to pandas dataframe
columns=[field.name for field in table.schema]
rows = table.fetch_data()
data = []
for row in rows:
    data.append(row)

df = pd.DataFrame(data=data[0],columns=columns)

我希望能够将超过1000万行的数据加载到Python中,几周前这项操作还正常运行,但现在只返回了10万行。有没有可靠的方法可以解决这个问题?


我也尝试了async_query.py,并使用rows = query_job.results().fetch_data(max_results=1000000)进行操作。但是似乎他们在某个地方设置了100,000的限制。有没有办法覆盖这个限制?或者有更有效率的方法来执行BigQuery到Python的计算? - vortex
你好,想问一下,你是否在WebUI或CLI中运行过这个查询,以查看它返回的总行数是否符合你的预期? - Willian Fuks
我在CLI中运行了代码,结果只有10万行数据。因此截断点可能在table.run()或table.fetch_data()之一。 - vortex
如果CLI也返回100k,那么看起来这实际上就是你表中所有的内容。看起来问题出在你的表格上,而不是在获取数据时达到了某个阈值。 - Willian Fuks
我在UI中运行了相同的查询,返回结果超过了3900万。但是使用Python程序时,很难诊断截止点出现在哪里。 - vortex
1个回答

3

我刚刚在这里测试了这段代码,可以获取300万行数据而不会出现任何限制:

import os
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'path/to/key.json'

from google.cloud.bigquery import Client

bc = Client()
query = 'your query'

job  = bc.run_sync_query(query)
job.use_legacy_sql = False
job.run()

data = list(job.fetch_data())

这对你有用吗?


啊,我明白了。看起来你正在使用旧版本的BQ客户端。我建议使用版本0.26.0。你可以通过运行以下命令查看你正在使用哪个版本:from google.cloud.bigquery import __version__;print(__version__) - Willian Fuks
是的,将 4000 万行数据带到单个实例中相当昂贵。这真的取决于你想做什么。我建议尝试使用 Apache Beam 中实现的数据流或者使用一些集群来运行你的分析,例如 Dataproc。对于后者,我有一个与主集群集成的 Jupyter,并发现它非常适用于日常数据分析。 - Willian Fuks
请问您能否提供更多有关Jupyter工作流程的实现细节?您是否使用DataLab?在处理大数据时,您是否设置了集群并直接将BigQuery数据带入内存中?如果有文档链接,那就更好了! - vortex
但是BQ -> GCS只允许导出小文件,而对于100GB的数据,它会分成多个部分。你是否只是将数据保存为.csv格式,并从Python中读取它?上次我尝试使用pd.read_csv('gs://...'),似乎不起作用。 - vortex
我运行了一个extract任务,压缩格式为“GZIP”,将结果存储到一个bucket中,确实将结果拆分成了几个文件。在Dataproc中,我只需要像这样加载文件:train_df = spark.read.csv('gs://BUCKET_NAME/FOLDER_NAME/train_data*.gz', header=True) - Willian Fuks
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接