Создать таблицу загрузки данных в BiqQuery из Java - PullRequest
0 голосов
/ 26 сентября 2018

Согласно документации здесь: https://cloud.google.com/bigquery/docs/tables#creating_a_table_when_you_load_data BigQuery должен иметь возможность создавать таблицу из данных.

Когда вы загружаете данные в BigQuery, вы можете загружать данные вНовая таблица или раздел, вы можете добавить данные в существующую таблицу или раздел, или вы можете перезаписать таблицу или раздел.Вам не нужно создавать пустую таблицу перед загрузкой в ​​нее данных.Вы можете создать новую таблицу и одновременно загрузить свои данные.

Однако я получаю сообщение об ошибке, что моя таблица не существует, когда я пытаюсь передать данные в BigQuery из Java.

Это пример оператора вставки, который работает, но только после того, как я вручную создаю свою таблицу:

InsertAllResponse response = bigQuery
        .insertAll(
                InsertAllRequest
                        .newBuilder(tableId)
                        .addRow(rowContent)
                        .build()
        );

Я могу создать схему на Java, а затем создать таблицу, но затем мне нужнопостоянно проверяйте, создана ли схема, прежде чем я смогу к ней перейти.generateBigQuerySchema - это метод, который я создал, который определяет схему.Приведенный ниже код потерпит неудачу, если схема уже существует, поэтому мне придется проверить, существует ли она, прежде чем создавать ее.

InsertAllResponse response = bigQuery
        .create(requestLog.generateBigQuerySchema(tableId))
        .getBigQuery()
        .insertAll(
                InsertAllRequest
                        .newBuilder(tableId)
                        .addRow(rowContent)
                        .build()
        );

1 Ответ

0 голосов
/ 27 сентября 2018

Я думаю, что вы смешали два разных типа ресурсов в соответствии с Ссылка API .Я имею в виду Jobs и Tabledata .

Jobs выполняет загрузку , где метод insertAll из Tabledata, не :

Потоки данных в BigQuery по одной записи за раз без необходимости запуска задания загрузки

Я вижу, что документы Google могут быть неверно истолкованы, как указано выше, потому что Введение в загрузкуДанные в BigQuery ссылаются на потоковые вставки (insertAll).Это выглядит так:

Вы можете загрузить данные:

... Вставляя отдельные записи, используя потоковые вставки ...

Где потоковые вставки перенаправляют на Потоковые данные в BigQuery , который говорит о потоковой передаче вместо загрузки:

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

Последняя информация о потоковых вставках (insertAll) :

Убедитесь, что у вас есть доступ на запись к набору данных, содержащему вашу таблицу назначения. Таблица должна существовать до того, как вы начнете записывать в нее данные, если только вы не используете таблицы шаблонов .Для получения дополнительной информации о таблицах шаблонов см. Создание таблиц автоматически с использованием таблиц шаблонов.

Если вы все еще хотите загрузить вместо потока таблицу шаблонов и одновременно создать таблицу, используйте Jobs и загрузить тип задания (или другой тип при необходимости)

Пример кода из моего вопроса :

Insert insert = bigquery.jobs().insert(projectId,
                   new Job().setConfiguration(
                            new JobConfiguration().setLoad(
                                   new JobConfigurationLoad()
                                                .setSourceFormat("NEWLINE_DELIMITED_JSON")
                                                .setDestinationTable(
                                                        new TableReference()
                                                                .setProjectId(projectId)
                                                                .setDatasetId(dataSetId)
                                                                .setTableId(tableId)
                                                )
                                                .setCreateDisposition("CREATE_IF_NEEDED")
                                                .setWriteDisposition(writeDisposition)
                                                .setSourceUris(Collections.singletonList(sourceUri))
                                                .setAutodetect(true)
                                )
                        ));

Job myInsertJob = insert.execute();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...