Обновите схему BigQuery / добавьте новый столбец в Java - PullRequest
0 голосов
/ 31 октября 2018

Мне нужно обновить схему таблиц BigQuery через Java. Изменение будет аддитивным (только добавление новых столбцов).

Я изо всех сил пытаюсь найти способ достигнуть этого. В Python это возможно так:

table_ref = client.dataset(dataset_id).table(table_id)
table = client.get_table(table_ref)  # API request

original_schema = table.schema
new_schema = original_schema[:]  # creates a copy of the schema
new_schema.append(bigquery.SchemaField('phone', 'STRING'))

table.schema = new_schema
table = client.update_table(table, ['schema'])  # API request

На странице https://cloud.google.com/bigquery/docs/managing-table-schemas, указано использование конечной точки исправления для этой задачи.

Была поднята проблема с улучшением API патча, но я не знаю о результате https://github.com/googleapis/google-cloud-java/issues/1564

Это ссылка на документацию класса исправлений: https://developers.google.com/resources/api-libraries/documentation/bigquery/v2/java/latest/com/google/api/services/bigquery/Bigquery.Tables.Patch.html#set-java.lang.String-java.lang.Object-

Любая помощь будет принята с благодарностью. Спасибо

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Мне также удалось сделать это через другой пакет Google BigQuery:

    HttpTransport transport = new NetHttpTransport();
    JsonFactory jsonFactory = new JacksonFactory();
    GoogleCredential credential;
    try {
        credential = GoogleCredential.getApplicationDefault(transport,
                jsonFactory);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
    if (credential.createScopedRequired()) {
        credential = credential.createScoped(BigqueryScopes.all());
    }

    Bigquery.Tables bqTables = new Bigquery.Builder(transport, jsonFactory, credential).build().tables();
    Bigquery.Tables.Get bqTableGet = bqTables.get(this.project, this.dataset, this.tablePrefix + strDate);

    Table bqTable = bqTableGet.execute();
    bqTable.setSchema(this.schema);

    Bigquery.Tables.Patch bqTablePatch = bqTables.patch(this.project, this.dataset, this.tablePrefix + strDate, bqTable);
    bqTablePatch.execute();
0 голосов
/ 01 ноября 2018

Идея в Java будет такой же, как и в примере Python, которым вы поделились, то есть получите текущую схему и добавите в нее новый столбец. Вы можете добиться этого с помощью подготовленного мной фрагмента, который вы можете увидеть ниже:

// Instantiate the BQ client
BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

// Get the table, schema and fields from the already-existing table
Table table = bigquery.getTable(TableId.of("PROJECT_ID", "DATASET", "TABLE"));
Schema schema = table.getDefinition().getSchema();
FieldList fields = schema.getFields();

// Create the new field
Field newField = Field.of("column2", LegacySQLTypeName.STRING);

// Create a new schema adding the current fields, plus the new one
List<Field> field_list = new ArrayList<Field>();
for (Field f : fields) {
    field_list.add(f);
}
field_list.add(newField);
Schema newSchema = Schema.of(field_list);

// Update the table with the new schema
Table updatedTable = table.toBuilder().setDefinition(StandardTableDefinition.of(newSchema)).build().update();

Этот код использует пакет com.google.cloud.bigquery (см. Документацию здесь ). Затем он определяет определение схемы, как это сделано в примере из документации таблиц , и, наконец, обновляет его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...