【问题标题】:Bigquery add columns to table schemaBigquery 将列添加到表架构
【发布时间】:2013-05-18 03:12:30
【问题描述】:

我正在尝试向 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]

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 您还可以在命令行上将架构指定为单行 CSV 对,例如bq 更新 dataset.table “名称:字符串,年龄:整数”。
    • 这很好用,尽管 bigquery 文档说一旦创建表架构就无法更新:一旦指定了表的架构,如果不先删除与之关联的所有数据,就无法更改它.如果要更改表的架构,则必须指定 WRITE_TRUNCATE 的 writeDisposition。有关详细信息,请参阅作业资源。
    • 如 2013 年 3 月 14 日的发行说明中所述,更新的表架构已添加到该版本 (developers.google.com/bigquery/release-notes) 但文档未更新:(
    • 在我们的例子中,我们必须使用“projectid 作为前缀”,即 bq update projectid:bq_dataset.bqtable table.json 错误消息不是很清楚
    【解决方案2】:

    在我的例子中,我试图将 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 用于模板表

    【讨论】:

      【解决方案3】:

      使用 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}});
      

      【讨论】:

      • 感谢您提供 Node.js 版本。它只对我有这个微小的变化: metaData.schema.fields = fields;等待 table.setMetadata(metaData);
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        您可以通过 GCP 控制台将 Schema 添加到您的表中更简单明了:-

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-03-22
          • 1970-01-01
          • 2020-06-10
          • 1970-01-01
          • 1970-01-01
          • 2017-01-03
          • 2021-11-17
          相关资源
          最近更新 更多