BigQueryの既存のテーブルに新しい列を追加しようとしています。私はbqコマンドツールとAPIアプローチを試しました。 Tables.update()を呼び出すと、次のエラーが発生します。
追加のフィールドを含む完全なスキーマを提供しようとしましたが、以下に示すのと同じエラーが発生します。
APIを使用すると、次のエラーが発生します。
{
"schema": {
"fields": [{
"name": "added_column",
"type": "integer",
"mode": "nullable"
}]
}
}
{
"error": {
"errors": [{
"domain": "global",
"reason": "invalid",
"message": "Provided Schema does not match Table [blah]"
}],
"code": 400,
"message": "Provided Schema does not match Table [blah]"
}
}
BQツールを使用すると、次のエラーが発生します。
./bq update -t blah added_column:integer
更新操作でのBigQueryエラー:提供されたスキーマがテーブル[blah]と一致しません
これを試して:
bq --format=prettyjson show yourdataset.yourtable > table.json
Table.jsonを編集し、「フィールド」の内部を除くすべてを削除します(たとえば、[ { "name": "x" ... }, ... ]
を保持します)。次に、新しいフィールドをスキーマに追加します。
またはパイプスルー jq
bq --format=prettyjson show yourdataset.yourtable | jq .schema.fields > table.json
次に、以下を実行します。
bq update yourdataset.yourtable table.json
コマンドラインの先頭に--apilog=apilog.txt
を追加すると、bigqueryサーバーから送信/返される内容が正確に表示されます。
私の場合、テンプレートテーブルにREQUIRED
フィールドを追加しようとしていて、このエラーが発生していました。フィールドをNULLABLE
に変更して、テーブルを更新します。
また、グーグルからつまずいた人のためのアップデートに関する最新バージョン。
#To create table
bq mk --schema domain:string,pageType:string,source:string -t Project:Dataset.table
#Or using schema file
bq mk --schema SchemaFile.json -t Project:Dataset.table
#SchemaFile.json format
[{
"mode": "REQUIRED",
"name": "utcTime",
"type": "TIMESTAMP"
},
{
"mode": "REQUIRED",
"name": "domain",
"type": "STRING"
},
{
"mode": "NULLABLE",
"name": "testBucket",
"type": "STRING"
},
{
"mode": "REQUIRED",
"name": "isMobile",
"type": "BOOLEAN"
},
{
"mode": "REQUIRED",
"name": "Category",
"type": "RECORD",
"fields": [
{
"mode": "NULLABLE",
"name": "Type",
"type": "STRING"
},
{
"mode": "REQUIRED",
"name": "Published",
"type": "BOOLEAN"
}
]
}]
# TO update
bq update --schema UpdatedSchema.json -t Project:Dataset.table
# Updated Schema contains old and any newly added columns
いくつかのドキュメント テンプレートテーブル用
BigQueryの使用例Node JS API:
const fieldDefinition = {
name: 'nestedColumn',
type: 'RECORD',
mode: 'REPEATED',
fields: [
{name: 'id', type: 'INTEGER', mode: 'NULLABLE'},
{name: 'amount', type: 'INTEGER', mode: 'NULLABLE'},
],
};
const table = bigQuery.dataset('dataset1').table('source_table_name');
const metaDataResult = await table.getMetadata();
const metaData = metaDataResult[0];
const fields = metaData.schema.fields;
fields.Push(fieldDefinition);
await table.setMetadata({schema: {fields}});
Pythonクライアントを使用して、BigQueryの既存のテーブルに列を追加しようとして立ち往生し、この投稿を数回見つけました。その後、念のため、それを解決するコードを使用します。誰かが同じ問題を抱えています:
# update table schema
bigquery_client = bigquery.Client()
dataset_ref = bigquery_client.dataset(dataset_id)
table_ref = dataset_ref.table(table_id)
table = bigquery_client.get_table(table_ref)
new_schema = list(table.schema)
new_schema.append(bigquery.SchemaField('LOLWTFMAN','STRING'))
table.schema = new_schema
table = bigquery_client.update_table(table, ['schema']) # API request