Чтение данных из Google Cloud BigQuery

Я новичок в мире конвейеров и Google API DataFlow.

Я хочу читать данные из BigQuery с помощью sqlQuery. Когда я читаю всю базу данных, она работает нормально.

PipelineOptions options = PipelineOptionsFactory.create();
Pipeline p = Pipeline.create(options);
PCollection<TableRow> qData = p.apply(
     BigQueryIO.Read
         .named("Read")
         .from("test:DataSetTest.data"));

Но когда я использую fromQuery, у меня возникает ошибка.

PipelineOptions options = PipelineOptionsFactory.create();
Pipeline p = Pipeline.create(options);
PCollection<TableRow> qData = p.apply(
     BigQueryIO.Read
         .named("Read")
         .fromQuery("SELECT * FROM DataSetTest.data"));

Ошибка:

Исключение в потоке «main» java.lang.IllegalArgumentException: проверка запроса «SELECT * FROM DataSetTest.data» не удалась. Если запрос зависит от более раннего этапа конвейера, эту проверку можно отключить с помощью #withoutValidation.

в com.google.cloud.dataflow.sdk.io.BigQueryIO $ Read $ Bound.dryRunQuery (BigQueryIO.java:449)

в com.google.cloud.dataflow.sdk.io.BigQueryIO $ Read $ Bound.validate (BigQueryIO.java:432)

в com.google.cloud.dataflow.sdk.Pipeline.applyInternal (Pipeline.java:357)

в com.google.cloud.dataflow.sdk.Pipeline.applyTransform (Pipeline.java:267)

в com.google.cloud.dataflow.sdk.values.PBegin.apply (PBegin.java:47)

в com.google.cloud.dataflow.sdk.Pipeline.apply (Pipeline.java:151)

в Test.java.packageid.StarterPipeline.main (StarterPipeline.java:72)

Вызвано: java.lang.NullPointerException: необходимо указать обязательный параметр projectId.

на com.google.api.client.repackaged.com.google.common.base.Preconditions.checkNotNull (Preconditions.java:229)

в com.google.api.client.util.Preconditions.checkNotNull (Preconditions.java:140)

в com.google.api.services.bigquery.Bigquery $ Jobs $ Query. (Bigquery.java:1751)

в com.google.api.services.bigquery.Bigquery $ Jobs.query (Bigquery.java:1724)

в com.google.cloud.dataflow.sdk.io.BigQueryIO $ Read $ Bound.dryRunQuery (BigQueryIO.java:445)

... еще 6

В чем проблема?

ОБНОВИТЬ:

Устанавливаю проект "options.setProject".

PipelineOptions options = PipelineOptionsFactory.create();
    Pipeline p = Pipeline.create(options);
    options.setProject("test");
    PCollection<TableRow> qData = p.apply(
         BigQueryIO.Read
             .named("Read")
             .fromQuery("SELECT * FROM DataSetTest.data"));

Но теперь я получил это сообщение. Таблица не найдена.

Вызвано: com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found {"code": 404, "errors": [{"domain": "global", "message": "Not found: Table test: _dataflow_ Contemporary_dataset_737099.dataflow_ Contemporary_table_550832 "," cause ":" notFound "}]," message ":" Not found: Table test: _dataflow_ Contemporary_dataset_737099.dataflow_ Contemporary_table_550832 "}


person Jan    schedule 20.01.2016    source источник


Ответы (1)


Все ресурсы в Google Cloud Platform, включая таблицы BigQuery и задания Dataflow, связаны с облачным проектом. Указание проекта необходимо при взаимодействии с ресурсами GCP.

Трассировка исключения говорит о том, что для преобразования BigQueryIO.Read: Caused by: java.lang.NullPointerException: Required parameter projectId must be specified не задан облачный проект.

Dataflow управляет значением по умолчанию для облачного проекта через свой PipelineOptions API. Dataflow по умолчанию будет использовать проект через его API, включая BigQueryIO.

Обычно мы рекомендуем создавать PipelineOptions из аргументов командной строки с помощью PipelineOptionsFactory.fromArgs(String) API. В этом случае вы просто передадите --project=YOUR_PROJECT в командной строке.

В качестве альтернативы это можно установить вручную в коде следующим образом:

GcpOptions gcpOptions = options.as(GcpOptions.class);
options.setProject("YOUR_PROJECT");

Наконец, начиная с версии 1.4.0 пакета Dataflow SDK для Java, Dataflow по умолчанию будет использовать облачный проект, заданный с помощью gcloud config set project <project>. Вы все еще можете переопределить его с помощью PipelineOptions, но в этом нет необходимости. Это могло работать в некоторых сценариях даже до версии 1.4.0, но могло не быть надежным во всех сценариях или комбинациях версий Cloud SDK и Dataflow SDK.

person Davor Bonaci    schedule 20.01.2016
comment
Я указал проект с Google Cloud SDK. - person Jan; 21.01.2016
comment
К сожалению, Google Cloud SDK изменил место, в котором он заполняет идентификатор проекта. Итак, есть сценарий и комбинация версий Cloud SDK и Dataflow SDK, в которых это не может быть автоматически заполнено в SDK. Это должно быть исправлено с помощью Dataflow SDK версии 1.4.0 и новее, которая будет выпущена через несколько дней. А пока укажите --project PipelineOption. - person Davor Bonaci; 22.01.2016
comment
Нужны ли мне сегменты для доступа к данным из GC BigQuery? - person Jan; 24.01.2016
comment
Звучит не имеет отношения к исходному вопросу. Сегменты - это концепция, используемая Google Cloud Storage (GCS). Чтобы отправить задание в службу Dataflow, вы должны указать промежуточное местоположение в GCS. Итак, вам нужно иметь корзину GCS для отправки любых заданий Dataflow. Это полностью ортогонально BigQuery - BigQuery не имеет и не требует сегментов. - person Davor Bonaci; 25.01.2016