如何通过BigQuery Java API区分按需与固定费率定价的查询?
解决方法:通过BigQuery Java API识别按需/固定费率查询
默认调用getJob(JobId)时,返回的Job对象不会加载所有字段(比如reservationUsage),需要显式指定要获取的字段集合,才能拿到区分定价类型的关键信息。
步骤1:修改API调用,指定需要的字段
调用getJob方法时,添加BigQuery.JobsGetOption.fields()参数,明确包含reservationUsage字段,同时保留你需要的其他核心字段(如配置、状态、统计信息):
import com.google.cloud.bigquery.BigQuery; import com.google.cloud.bigquery.BigQueryOptions; import com.google.cloud.bigquery.Job; import com.google.cloud.bigquery.JobId; public class GetJobWithReservation { public static void main(String[] args) { String projectId = "你的项目ID"; String jobIdStr = "目标Job的ID"; String location = "Job所在区域"; // 例如US、EU BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService(); JobId jobId = JobId.newBuilder() .setJob(jobIdStr) .setLocation(location) .setProject(projectId) .build(); // 显式指定要获取的字段,包含reservationUsage Job job = bigquery.getJob(jobId, BigQuery.JobsGetOption.fields( "jobConfiguration", "status", "statistics", "reservationUsage" )); // 判断定价类型 if (job.getReservationUsage() != null && !job.getReservationUsage().isEmpty()) { System.out.println("该查询使用固定费率(预留资源)定价"); // 可进一步查看预留详情 job.getReservationUsage().forEach(usage -> { System.out.println("预留ID: " + usage.getReservationId()); System.out.println("槽位使用时长: " + usage.getSlotMs()); }); } else { System.out.println("该查询使用按需定价"); } } }
关键逻辑说明
- 固定费率查询:当查询使用预留资源时,
job.getReservationUsage()会返回非空列表,包含该查询消耗的预留资源详情(如预留ID、槽位使用时长)。 - 按需定价查询:此类查询不关联任何预留资源,
job.getReservationUsage()会返回null或空列表。
注意事项
- 确保服务账号拥有
bigquery.jobs.get权限,否则无法获取Job的完整信息。 - 若Job为跨地区执行,必须在
JobId中指定正确的location,否则会出现Job找不到的情况。
内容的提问来源于stack exchange,提问作者saivasanth528
相关产品推荐
相关产品推荐

