可用于计算 BigQuery 查询成本的 Python API 是啥?

Posted

技术标签:

【中文标题】可用于计算 BigQuery 查询成本的 Python API 是啥?【英文标题】:What is the Python API I can use to calculate the cost of a BigQuery query?可用于计算 BigQuery 查询成本的 Python API 是什么? 【发布时间】:2019-10-25 15:08:10 【问题描述】:

有人知道如何使用 Python Google Cloud BigQuery API 计算查询成本吗?

【问题讨论】:

【参考方案1】:

1。获取查询处理的数据量

使用 Google Cloud Python SDK,您可以设置 dry_run 标志。

job_config = bigquery.QueryJobConfig()
job_config.dry_run = True
job_config.use_query_cache = False
query_job = client.query(
  ...
)
bigquery/docs/snippets.py Google Cloud Docs: Issuing a query dry run

2。从total_bytes_processed 计算成本

如果您使用的是on-demand pricing,请查看query_job.total_bytes_processed,了解您需要为多少处理数据付费。当前处理成本(截至 2019 年 10 月)为 每 TB 5 美元,其中第一个 TB 是免费的。

因此,您可以通过以下方式获得成本:

cost_dollars = (query_job.total_bytes_processed / 1024 ** 4) * 5

【讨论】:

感谢您的回复!你知道如何推导出与查询相关的美元成本吗?大查询在账户中的成本计算有很多因素,如基于活动存储、查询(包年费)、长期存储。 cloud.google.com/bigquery/pricing 很难计算出与查询相关的美元。有没有人知道python函数会做(我们可以编写简单的匹配query_job.total_bytes_processed/GB price per query。谢谢,Anand C @Anand,其中大多数(尤其是存储)不会影响特定查询的成本。唯一可能的情况是您使用统一费率定价,但在这种情况下,插槽使用(实际上只是间接“定价”)将取决于查询本身的实际执行。没有办法提前计算。 查询的按需定价为 5 美元/TB 扫描,因此您可以使用 total_bytes_processed 重新计算。例如如果total_bytes_processed 是 1TB,那么它会花费你 5 美元。 更新了答案,以更具体地说明您如何为按需定价执行此操作。 总是删除 1 个免费 TB 可能没有意义,因为这并不是真正的每次查询效果。【参考方案2】:

我认为您不能直接计算成本,但您可以使用 python API 中的 dryRun 参数来获取处理的字节数,然后您可以将其转换为成本(在 $5/listed on demand price TB)。

类似:

from google.cloud import bigquery

job_config = bigquery.QueryJobConfig()
job_config.dry_run = True
job_config.use_query_cache = False
query_job = bigquery.Client().query(
    (
        "SELECT my_column FROM my_table"
    ),
    location="US", # or wherever your data is
    job_config=job_config,
)

print(" bytes will be processed".format(query_job.total_bytes_processed))

这里也引用了cost estimation docs。

【讨论】:

当您查询query_job = bigquery.Client().query 行时,您是否已经输了钱。有什么方法可以在运行它之前知道多少字节,就像在 BigQuery 上工作一样! 如果您指定dry_run,则不会,@ChauLoi【参考方案3】:

如果你有一个项目,你可能想做:

from google.cloud import bigquery

bqclient = bigquery.Client(
    project='myproject',
)

query = "SQL BLA BLA SELECT etc.. " 
job_config = bigquery.QueryJobConfig()
job_config.dry_run = True
job_config.use_query_cache = False
query_job = bqclient.query(
    
    (
       query
    ),
    location="US", # or wherever your data is
    job_config=job_config,
)

cost_dollars = (query_job.total_bytes_processed / 1024 ** 4) * 5

print(f"query_job.total_bytes_processed bytes will be processed , cost ~cost_dollars$")

【讨论】:

以上是关于可用于计算 BigQuery 查询成本的 Python API 是啥?的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 定价:记录列的查询数据大小(成本)计算

Google Bigquery - 运行参数化查询 - php

BigQuery:我可以通过将数据存储在多个表中来降低查询成本吗?

如何下载在 BigQuery 中进行的所有查询?

用于 Google BigQuery 的 SQL 查询以计算会话和浏览量

Bigquery 集群不会降低查询成本