如何通过Job ID在BigQuery中计算并获取作业成本?
获取BigQuery作业的精准成本(按Job ID)
核心思路:直接利用INFORMATION_SCHEMA.JOBS_BY_PROJECT计算
账单导出表(billing.gcp_billing_export_v1_XXXXX)的粒度是账单级聚合,无法直接关联单个Job ID,而JOBS_BY_PROJECT表包含每个作业的核心计费字段,是按Job ID计算成本的最优数据源。
1. 按需计费模式(On-Demand)
BigQuery按需计费以**扫描的字节数(total_bytes_billed)**为依据,按TB计价(1TB = 1024^4 字节)。
计算SQL示例
SELECT job_id, project_id, job_type, end_time, total_bytes_billed, -- 转换为TB单位,乘以当前按需单价(示例为$5/TB,需根据实际定价调整) ROUND((total_bytes_billed / POWER(1024, 4)) * 5, 4) AS on_demand_cost_usd, -- 可选:减去每月10GB免费额度(按作业分摊) ROUND(GREATEST((total_bytes_billed / POWER(1024, 4)) * 5 - (10 / 1024), 0), 4) AS on_demand_cost_after_free_tier_usd FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE -- 过滤出计费的作业类型(仅QUERY作业按需计费) job_type = 'QUERY' -- 按需调整时间范围 AND end_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY) ORDER BY on_demand_cost_usd DESC;
2. 平坦费率模式(Flat Rate)
平坦费率按**插槽使用时长(slot_millis)**计费,单位为毫秒,需转换为小时后乘以单插槽小时单价。
计算SQL示例
SELECT job_id, project_id, job_type, end_time, slot_millis, -- 转换为小时单位,乘以当前单插槽小时单价(示例为$0.046/小时,需根据实际定价调整) ROUND((slot_millis / 3600000) * 0.046, 4) AS flat_rate_cost_usd FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE -- 平坦费率下所有使用插槽的作业均计费(可按需过滤类型) slot_millis > 0 AND end_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY) ORDER BY flat_rate_cost_usd DESC;
关键注意事项
- 字段优先级:按需计费必须用
total_bytes_billed,而非total_bytes_processed——BigQuery按扫描的全量数据计费,即使你只用到部分结果。 - 免费额度:每月10GB的免费处理量仅适用于按需计费,需在计算中手动扣除(分摊到各作业)。
- 作业类型过滤:加载(LOAD)、导出(EXPORT)等作业通常不计费,需通过
job_type字段过滤。 - 定价变动:GCP定价可能调整,建议将单价维护在一个配置表中,避免硬编码。
关于账单表关联的说明
由于账单表是聚合粒度(按天/账单周期汇总),无法直接通过Job ID关联,但可以用以下方式验证计算准确性:
- 从
JOBS_BY_PROJECT按天汇总总费用 - 从账单表提取对应日期的BigQuery总费用
- 对比两者偏差(通常在1%以内,因账单包含少量额外费用如存储)
内容的提问来源于stack exchange,提问作者Alan Mil
相关产品推荐
相关产品推荐

