【问题标题】:BigQuery Client bigquery.listTableData with Filter condition带有过滤条件的 BigQuery 客户端 bigquery.listTableData
【发布时间】:2022-01-27 06:22:06
【问题描述】:

我正在使用以下代码行从 Google Bigquery 获取数据。

 public class BQTEST {
        public static void main(String... args) throws Exception {
            String datasetName = "mydataset";
            String tableName = "mytable";
            String projectId = "id-gcs";
            String query =
                    "SELECT id, " +
                            "qtr, " +
                            "sales, " +
                            "year " +
                            "FROM `id-gcs.mydataset.mytable` " +
                            "where MOD(id,2) = 0";
            BigQuery bigquery = BigQueryOptions.newBuilder().setProjectId(projectId)
                    .setCredentials(
                            ServiceAccountCredentials.fromStream(new
                                    FileInputStream("gcs.json"))
                    )
                    .build().getService();
            TableId tableId = TableId.of(projectId, datasetName, tableName);
            QueryJobConfiguration queryConfig = QueryJobConfiguration
                    .newBuilder(query)
                    .setPriority(QueryJobConfiguration.Priority.BATCH)
                    .build();
            try {
                bigquery.query(queryConfig);
    
            } catch (InterruptedException e) {
                e.printStackTrace();
                throw new RuntimeException(e.getMessage());
            }
            TableResult results = bigquery.listTableData(
                    tableId,
                    BigQuery.TableDataListOption.pageSize(1)
            );
    
    
            for (FieldValueList row : results.iterateAll()) {
                System.out.printf(
                        "ID: %s qtr: %s sales: %s year: %s\n", row.get(0).getValue(), row.get(1).getValue(), row.get(2).getValue(), row.get(3).getValue());
            }
        
        }
    }

我在源表中有 12 条记录,起始 id 值从 1、2、3...12 开始。由于我在 ID 上应用了 Mod,结果集的 id 值应为 2,4,6,8,10,12。

相反,它将整个数据作为结果集返回。

因此,where 子句中的条件不适用。

寻求帮助。

【问题讨论】:

  • 过滤器是什么意思?是页面大小吗?还是其他过滤器?你能举一个失败的例子吗?以及 IDE 打印的错误?
  • 由于我无法添加更多代码行,因此编辑了我的帖子。请检查。
  • 它可以在 BigQuery 控制台上运行吗?
  • 是的。该查询在 BigQuery 控制台中运行。 “查询完成(经过 0.2 秒,已处理 312 B)”
  • 在执行变量之前,能否打印出变量“query”的值并在 BigQuery 控制台中执行?

标签: java google-cloud-platform google-bigquery gcs


【解决方案1】:

您在这里做了两件不相关的事情:运行查询,然后然后尝试直接从您刚刚查询的源表中读取行。您没有得到过滤结果的原因是您没有从查询结果中读取行,而是直接从源表中读取行。

经过进一步审查,这似乎是基于一些具有误导性的示例代码;我会解决的。

一个可能更具启发性的简短示例:https://cloud.google.com/bigquery/docs/samples/bigquery-query#bigquery_query-java

值得注意,看看结果迭代器是如何从bigquery.query() 返回的。这就是您的过滤结果可用的地方,而不是通过对源表进行迭代。

【讨论】:

  • 我怀疑造成混淆的原因可能是样本略有不同。 cloud.google.com/bigquery/docs/samples/… 演示将查询结果写入新表,然后从该新表而不是查询迭代器中读取。查询配置生成器中的 setDestinationTable() 选项是其中的关键区别。
  • 感谢您的详细解释。那么是否有可能将条件子句与 bigquery.listTableData 一起使用,或者 bigquery.listTableData 将始终返回给定表中的整个数据集。
  • tabledata.list 无法进行服务器端过滤。如果您有兴趣探索这条路线,请查看存储读取 API,它允许投影和过滤:cloud.google.com/bigquery/docs/reference/storage
猜你喜欢
  • 1970-01-01
  • 2018-05-12
  • 2013-08-29
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 2022-01-06
  • 1970-01-01
相关资源
最近更新 更多