是否可通过JDBC调用BigQuery的tabledata.list方法?
关于BigQuery JDBC中
tabledata.listAPI的实现方案 存在可落地的实现方案,不需要依赖Magnitude Simba的商业JDBC驱动即可调用该接口,完全规避驱动相关的额外计费,仅产生BigQuery原生API的使用成本。
核心实现思路
- 直接引入Google官方开源的
google-cloud-bigqueryJava依赖,该依赖完全免费,无额外授权费用,已经内置了tabledata.list接口的封装实现 - 按需自定义实现JDBC核心接口即可满足使用需求,不需要完整实现JDBC全量规范:仅需封装
Connection、Statement、ResultSet三类核心接口,覆盖自身业务常用的查询、数据读取场景即可,不常用的接口方法可以直接抛出UnsupportedOperationException减少开发量 - 读取全表数据的场景下直接调用依赖封装的
listTableData方法,底层对应的就是BQ的tabledata.listAPI,计费规则和直接调用原生API完全一致
核心调用代码示例
首先引入Maven依赖:
<dependency> <groupId>com.google.cloud</groupId> <artifactId>google-cloud-bigquery</artifactId> <version>最新稳定版本号</version> </dependency>
核心调用逻辑参考:
// 初始化BigQuery客户端,默认读取本地/环境变量中的鉴权配置 BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService(); // 配置目标表信息 TableId targetTable = TableId.of("你的GCP项目ID", "目标数据集ID", "目标表名"); // 调用tabledata.list对应接口拉取数据,可自定义分页大小 TableResult tableData = bigquery.listTableData(targetTable, BigQuery.ListTableDataOption.pageSize(1000)); // 遍历获取每行数据 for (FieldValueList row : tableData.iterateAll()) { // 按字段名/索引获取对应字段值即可 String name = row.get("user_name").getStringValue(); Long id = row.get("user_id").getLongValue(); }
注意事项
- 如果业务需要支持SQL查询,也可以直接调用
google-cloud-bigquery封装的query方法,底层走BQ原生jobs.queryAPI,同样不需要依赖Simba驱动 tabledata.list更适合小批量全表读取场景,如果需要读取TB级以上的大表数据,更推荐使用BigQuery存储读API,吞吐更高、单位数据成本更低
内容的提问来源于stack exchange,提问作者Vasilii Chernov
相关产品推荐
相关产品推荐

