繁体   English   中英

Python BigQuery 客户端多次执行相同的查询

[英]Python BigQuery client executing same query multiple times

我遇到了一个问题,当我查询大数据(35M 行,22GB 数据)时,相同的查询在后台执行了多次(例如 400 次)。 我了解数据以某种方式被分区/洗牌。 大大增加了查询成本。

这就是我查询数据的方式:

from google.cloud import bigquery

bqclient = bigquery.Client(project)
query_job = bqclient.query(query).result()
df_result = query_job.to_dataframe()

其中projectquery是 Python 字符串。

我正在使用google-cloud-bigquery==2.30.1

我正在寻找任何程序化解决方案来降低查询成本。 例如,是否有不同的类/配置/对象/方法/库可以更好地处理此类查询?

我怀疑这是因为你调用了result()两次,一次是在你运行query_job = bqclient.query(query).result()时,一次是在你运行df_result = query_job.to_dataframe()时(再次调用query_job )。 不知道为什么它运行了这么多次,但可能与result()的工作方式有关( https://googleapis.dev/python/bigquery/latest/generated/google.cloud.bigquery.client.Client.html#google. cloud.bigquery.client.Client.query应该有更多信息)

您想要的“基本”答案是df_result = bqclient.query(query).to_dataframe() 但是,如果您要查询大型数据集,这可能需要一些时间。 请参阅从 BigQuery 读取到 Pandas DataFrame 和性能问题以获得更好的方法。

关于降低查询成本的旁注:如果您在本地 Python 环境中工作,您可能不想在那里处理 22GB 的数据。 例如,如果您要构建 ML model,您可能想要提取 1/1000 的数据(SQL 中的简单LIMIT不会降低查询成本,您希望在日期列上对表进行分区并过滤在那个或创建一个包含行子集的新表并查询它)并处理它。 请注意,您的数据子集上的 model 将不准确,这只是为了确保您的 Python 代码适用于该数据。 然后,您将代码部署到云环境并在完整数据上运行它。 这里有很好的端到端示例: https://github.com/GoogleCloudPlatform/training-data-analyst/tree/master/courses/machine_learning/deepdive2/structured/solutions

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM