Bigquery将列添加到表模式

时间:2013-05-22 22:08:31

标签: google-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]不匹配

5 个答案:

答案 0 :(得分:42)

试试这个:

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服务器发送/返回的内容。

答案 1 :(得分:4)

在我的情况下,我试图将REQUIRED字段添加到模板表中,并且遇到了此错误。将字段更改为NULLABLE,让我更新表格。

最新版本的更新版本适用于任何绊倒Google的人。

#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 

Some docs用于模板表

答案 2 :(得分:1)

我一直试图使用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

答案 3 :(得分:1)

使用BigQuery Node JS API的示例:

@Test
public void testHalfEach() {
    final int[] inp = new int[100_000];
    final int exp = -1;
    Arrays.fill(inp, 0, 50_000, 0);
    Arrays.fill(inp, 50_000, 100_000, 1);
    validate(inp, exp);
}

private void validate(int[] inp, int exp)
{
    PassingCars prog = new PassingCars();
    int ans = prog.solution(inp);
    assertEquals(exp, ans);
}

答案 4 :(得分:0)

您可以通过GCP控制台将模式添加到您的表中,更加轻松和清除:-

Add schema To you table