2016-03-29 9 views
1

関連の質問を使用して、既存のテーブルに新しい列を追加します。Bigquery add columns to table schema using BQ command line toolsBigQueryは:PythonのBQのAPIに

私はBigQueryのPython API使用したBigQuery内の既存のテーブルに新しい列を(既存のテーブルのスキーマを更新)を追加します。

しかし、私のコードは動作していないようです。ここで

は私のコードです:

flow = flow_from_clientsecrets('secret_key_path', scope='my_scope') 
    storage = Storage('CREDENTIAL_PATH') 
    credentials = storage.get() 
    if credentials is None or credentials.invalid: 
     credentials = tools.run_flow(flow, storage, tools.argparser.parse_args([])) 
    http = httplib2.Http() 
    http = credentials.authorize(http) 
    bigquery_service = build('bigquery', 'v2', http=http) 
    tbObject = bigquery_service.tables() 
    query_body = {'schema': {'name':'new_column_name', 'type':'STRING'}} 
    tbObject.update(projectId='projectId', datasetId='datasetId', tableId='tableId', body=query_body).execute() 

それはProvided schema doesn't match existing table's schemaエラーを返します。 誰かが私にPythonの実例を教えてもらえますか? 多くの感謝!

+0

このフィールドを取得するために新しいテーブルを使用して 既存のテーブルに参加されることを、いくつかの鍵は、あなたが全体のスキーマ、新しいフィールド –

+0

こんにちはミハイルないだけを提供しなければなりません既存のテーブルのスキーマ全体を意味しますか? –

+1

はい、新しいフィールドが追加されました。 apiは新しいAPIを追加する責任があります。これが起こるためには、スキーマ全体を提示する必要があります –

答えて

2

i)は、このために今、いくつかの分を持っている:

  • 全体のスキーマ(新しいフィールドと一緒に)既存の行にnullで追加されます
  • 新しいフィールドをAPIに供給する必要があります。設定する方法がありません 値
  • これを補うために、 に対して実行するクエリにいくつかのロジックを設定することができます。または、あなたは だけで、この新しいフィールドを持つ別のテーブルを持つことができ、あなたが
+0

スキーマの更新に適用されるパッチと更新の詳細:http://stackoverflow.com/a/17113985/1375400 –

4

ベースMikhail Berlyantのコメントです。既存のテーブルのスキーマを更新するには、新しいフィールド(列)を持つ既存のテーブルのスキーマをupdate()メソッドに渡す必要があります。

Pythonのコード例を以下に示す:

... 
tbObject = bigquery_service.tables() 
# get current table schema 
table_data = tbObject.get(projectId=projectId, datasetId=datasetId, tableId=tableId).execute() 
schema = table_data.get('schema') 
new_column = {'name': 'new_column_name', 'type': 'STRING'} 
# append new field to current table's schema 
schema.get('fields').append(new_column) 
query_body = {'schema': schema} 
tbObject.update(projectId='projectId', datasetId='datasetId', tableId='tableId', body=query_body).execute() 

し、また、既存の行(テーブル)のための新しい列の値を設定する方法はありません。 Mikhail Berlyant提案ありがとう、既存の行の値を設定する方法は、新しい列の値を持つ別のテーブルを作成し、既存のテーブルをそのテーブルと結合して古いスキーマテーブルを置き換えることです