【问题标题】:How can I access Schema from the QueryResponse while calling getQueryResults method from my Java application?从 Java 应用程序调用 getQueryResults 方法时,如何从 QueryResponse 访问 Schema?
【发布时间】:2019-05-21 00:57:15
【问题描述】:

我正在使用 google.cloud.bigquery 库使用 bigquery.query() 方法执行和创建查询。我想从响应中获取Schema 详细信息,但是每当查询未返回任何结果时,我都会得到EmptyTableResult 而不是应该在其中列出Schema 和字段的响应。我使用了另一种创建作业然后使用查询作业的方法,我正在调用bigquery.getQueryResults,它应该返回QueryResponse 对象。下面是代码sn-p。

QueryJobConfiguration queryConfig = 
QueryJobConfiguration.newBuilder(queryString)

.setDefaultDataset(bqDatasetId).setUseLegacySql(false)

 .setFlattenResults(true).build();

JobId jobId = JobId.of(UUID.randomUUID().toString());
        Job queryJob = bigQuery.create(JobInfo.newBuilder(queryConfig).setJobId(jobId).build());

        // Wait for the query to complete.
        queryJob = queryJob.waitFor();

        // Check for errors
        if (queryJob == null) {
          throw new RuntimeException("Job no longer exists");
        } else if (queryJob.getStatus().getError() != null) {
          throw new RuntimeException(queryJob.getStatus().getError().toString());
        }

        // Get the results.
        QueryResponse response = bigQuery.getQueryResults(queryJob.getJobId());
        System.out.println(response);

在这里,在sysout 语句中,我得到了正确的响应,但是每当我尝试使用response.getSchema() 时,都会出现编译错误,提示getSchema() 不可见。谁能帮我这个?这种方法是正确的还是有其他方法可以做同样的事情?

【问题讨论】:

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


    【解决方案1】:

    您需要改为在 Job 对象上调用 getQueryResults()。这会给你一个TableResult 对象。然后您可以调用getSchema() 来获取查询/表/作业的架构。所以,把它们放在一起:

    QueryJobConfiguration queryConfig =
                    QueryJobConfiguration.newBuilder(
                            "SELECT "
                                    + "CONCAT('https://stackoverflow.com/questions/', CAST(id as STRING)) as url, "
                                    + "view_count "
                                    + "FROM `bigquery-public-data.stackoverflow.posts_questions` "
                                    + "WHERE tags like '%google-bigquery%' "
                                    + "ORDER BY favorite_count DESC LIMIT 10")
                            .setUseLegacySql(false)
                            .build();
    
            JobId jobId = JobId.of(UUID.randomUUID().toString());
            Job queryJob = BIGQUERY.create(JobInfo.newBuilder(queryConfig).setJobId(jobId).build());
            queryJob = queryJob.waitFor();
    
            TableResult result = queryJob.getQueryResults(); //<--you need this
            Schema schema = result.getSchema(); //<--..and this
    
            System.out.println(schema);
    

    产量:

    Connected to the target VM, address: '127.0.0.1:64695', transport: 'socket'
    Schema{fields=[Field{name=url, type=STRING, mode=NULLABLE, description=null}, Field{name=view_count, type=INTEGER, mode=NULLABLE, description=null}]}
    

    【讨论】:

    • 嗨,格雷厄姆,感谢您回复。我也试过这个,但它给了我 EmptyTableResult。我想获取暂时不返回任何结果的查询架构。
    • 由于 API 现在可以工作,如果查询返回为空,它应该返回 null。正如您在问题中所说,响应本身包含架构(即使查询返回 null)等等,因此您可以在必要时从那里解析它。在您的代码中,response.getSchema() 将不再工作,因为在旧版本的 BigQuery 库中就是这样完成的。可以看到以前使用here的例子,例子9。
    【解决方案2】:

    经过大量搜索,我得出一个结论,最好使用反射来调用不可见的 QueryRespons.getSchema() 方法,它就像一个魅力。虽然,反射不是一个理想的解决方案,但它已经解决了我的问题。

    【讨论】:

      【解决方案3】:

      另一种方法是使用此票中的解决方案Querying Column Headers in GBQ

      这是在运行查询而不是使用 api

      【讨论】:

      • 我只使用api,不直接运行查询。不过谢谢:)
      猜你喜欢
      • 2013-10-26
      • 1970-01-01
      • 2012-06-23
      • 2017-11-10
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多