web-dev-qa-db-ja.com

Bigqueryはテーブルスキーマに列を追加します

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]と一致しません

20
archman

これを試して:

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サーバーから送信/返される内容が正確に表示されます。

42
Jordan Tigani

私の場合、テンプレートテーブルに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 

いくつかのドキュメント テンプレートテーブル用

4
akotian

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}});
2
Melle

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
2