![](/img/trans.png)
[英]How to limit execution time in bigquery client query using python
[英]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()
其中project
和query
是 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.