Можем ли мы изменить местоположение из США в другой регион при чтении данных из Bigquery с помощью библиотеки Bigquery java? - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь прочитать данные из Bigquery , используя Bigquery java библиотека .

Мой набор данных не находится в США, поэтому, когда я передаю имя набора данных в библиотеку, он выдает ошибку, что набор данных не найден в США, так как он выполняет поиск по умолчанию в США.

Я также пытался указать местоположение с помощью setLocation ("asia-southeast1"), но все же оно находит в США.

Это мой фрагмент кода:

val bigquery: BigQuery =BigQueryOptions.newBuilder().setLocation("asia-southeast1").build().getService
val query = "SELECT TO_JSON_STRING(t, true) AS json_row FROM "+dbName+"."+tableName+" AS t"
logger.info("Query is " + query)
val queryResult: QueryJobConfiguration = QueryJobConfiguration.newBuilder(query).build
val result: TableResult = bigquery.query(queryResult)

Я пишу код в SCALA. Поскольку он использует те же библиотеки, что и JAVA, а JAVA более популярен, поэтому я прошу об этом JAVA.

Пожалуйста, помогите мне узнать, как я могу изменить местоположение с США на юго-восток.

Могу ли я что-то изменить внутри QueryJobConfiguration , так как я искал a-lot, но не могу ничего найти.

Мое единственное требование - я хочу получить конечный результат в виде TableResult. ,

Это исключение, которое выдается

com.google.cloud.bigquery.BigQueryException: Not found: Dataset XXXXXXXX was not found in location US
at com.google.cloud.bigquery.spi.v2.HttpBigQueryRpc.translate(HttpBigQueryRpc.java:106)
at com.google.cloud.bigquery.spi.v2.HttpBigQueryRpc.getQueryResults(HttpBigQueryRpc.java:584)
at com.google.cloud.bigquery.BigQueryImpl$34.call(BigQueryImpl.java:1203)
at com.google.cloud.bigquery.BigQueryImpl$34.call(BigQueryImpl.java:1198)
at com.google.api.gax.retrying.DirectRetryingExecutor.submit(DirectRetryingExecutor.java:105)
at com.google.cloud.RetryHelper.run(RetryHelper.java:76)
at com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:50)
at com.google.cloud.bigquery.BigQueryImpl.getQueryResults(BigQueryImpl.java:1197)
at com.google.cloud.bigquery.BigQueryImpl.getQueryResults(BigQueryImpl.java:1181)
at com.google.cloud.bigquery.Job$1.call(Job.java:329)
at com.google.cloud.bigquery.Job$1.call(Job.java:326)
at com.google.api.gax.retrying.DirectRetryingExecutor.submit(DirectRetryingExecutor.java:105)
at com.google.cloud.RetryHelper.run(RetryHelper.java:76)
at com.google.cloud.RetryHelper.poll(RetryHelper.java:64)
at com.google.cloud.bigquery.Job.waitForQueryResults(Job.java:325)
at com.google.cloud.bigquery.Job.getQueryResults(Job.java:291)
at com.google.cloud.bigquery.BigQueryImpl.query(BigQueryImpl.java:1168)
...

Заранее спасибо.

1 Ответ

0 голосов
/ 07 января 2020

На самом деле вам не нужно указывать местоположение, потому что BigQuery выведет его из набора данных, на который ссылается ваш запрос. См. здесь .

При загрузке данных, запросе данных или экспорте данных BigQuery определяет местоположение для запуска задания на основе наборов данных, указанных в запросе. Например, если запрос ссылается на таблицу в наборе данных, хранящемся в регионе asia-northeast1, задание запроса будет выполняться в этом регионе.

Я только что протестировал использование SDK Java для набора данных / таблица, которую я создал в asia-southeast1, и она работала без необходимости явно указывать местоположение.

enter image description here

enter image description here

Если он по-прежнему не работает для вас по умолчанию (проверьте, что таблица, на которую вы ссылаетесь, действительно существует), то вы можете указать местоположение, установив его в JobId и передав его перегруженному методу:

String query = "SELECT * FROM `grey-sort-challenge.asia_southeast1.a_table`;";
        QueryJobConfiguration queryConfig = QueryJobConfiguration.newBuilder(query)
                .setUseLegacySql(Boolean.FALSE)
                .build();

        JobId id = JobId.newBuilder().setLocation("asia-southeast1")
                .setRandomJob()
                .build();
        try {
            for (FieldValueList row : BIGQUERY.query(queryConfig, id).iterateAll()) {
                for (FieldValue val : row) {
                    System.out.printf("%s,", val.toString());
                }
                System.out.printf("\n");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
...