我需要通过Java更新BigQuery表架构。更改将是累加的(仅添加新列)。
我正在努力寻找一种方法来实现这一目标。在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
任何帮助将不胜感激。谢谢
答案 0 :(得分:0)
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
包(请参见其documentation here)。然后,它按照tables documentation的示例中的说明指定架构定义,并最终对其进行更新。
答案 1 :(得分:0)
我还设法通过其他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();