Как я могу получить доступ к схеме из QueryResponse при вызове метода getQueryResults из моего Java-приложения? - PullRequest
0 голосов
/ 20 декабря 2018

Я использую библиотеку google.cloud.bigquery для выполнения и создания запроса методом bigquery.query().Я хочу получить Schema подробности из ответа, но всякий раз, когда запрос не возвращает результата, я получаю EmptyTableResult вместо ответа, который должен содержать Schema и поля, перечисленные в нем.Я использовал другой подход, который создает задание, а затем, используя задание запроса, я вызываю bigquery.getQueryResults, который должен вернуть QueryResponse объект.Ниже приведен фрагмент кода.

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() не видноКто-нибудь может мне с этим помочь?Является ли этот подход правильным или есть другой подход, который может сделать то же самое?

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Другой подход заключается в использовании решения, указанного в этом билете. Запрос заголовков столбцов в GBQ

. Это - выполнение запроса и не использование API

.
0 голосов
/ 24 декабря 2018

После долгих поисков я пришел к выводу, что лучше использовать отражения для вызова невидимого метода QueryRespons.getSchema (), и он работает как чудо.Хотя рефлексия не является идеальным решением для этого, но она решила мою проблему.

0 голосов
/ 21 декабря 2018

Вам нужно вызвать getQueryResults() для объекта Job.Это вернет вам объект 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}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...