Google bigquery 在通过Google API客户端对Google BigQuery中的现有表进行修补操作期间,架构更新无效

Google bigquery 在通过Google API客户端对Google BigQuery中的现有表进行修补操作期间,架构更新无效,google-bigquery,Google Bigquery,我试图通过RubyGoogleAPI客户端使用补丁更新现有表的模式 代码如下: def updateTable(client, bq, schema,dataset,table) result = client.execute(:api_method => bq.tables.patch, :parameters => {'projectId' => PROJECT, 'datasetId' => dataset, 'tabl

我试图通过RubyGoogleAPI客户端使用补丁更新现有表的模式

代码如下:

    def updateTable(client, bq, schema,dataset,table)
        result = client.execute(:api_method =>  bq.tables.patch,  
        :parameters => {'projectId' => PROJECT, 'datasetId' => dataset, 'tableId' => table},
        :body_object => {
                  "tableReference" => {
                    "datasetId" => dataset,
                    "projectId" => "mydataset-1",
                    "tableId"   => table
                  },
                  "schema" => schema
                }
        )
        puts result.body    
结束

下面是我得到的错误:

    {
      "error": {
        "errors": [
          {
            "domain": "global",
            "reason": "invalid",
            "message": "Invalid schema update. Field a_b_testing_group is missing in new schema"
          }
       ],
        "code": 400,
       "message": "Invalid schema update. Field a_b_testing_group is missing in new schema"
} }

我会很感激你的指点和建议。 谢谢

下面是一个示例模式:

{ "fields" : [
    { "fields" : [ 
        { "mode" : "NULLABLE",
          "name" : "time",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "attempts",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "mode",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "distinct_id",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "waited",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "party_size",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "version",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "region",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "reachability",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "device",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "_os",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "a_b_testing_group",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "item_name",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "price",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "contestant",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "mp_country_code",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "_city",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "_region",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "source",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "label",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "sku",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "balance__soft_",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "balance__hard_",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "price__soft_",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "free",
          "type" : "BOOLEAN"
        },
        { "mode" : "NULLABLE",
          "name" : "price__hard_",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "magical_damage_dealt",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "magical_damage_dealt__players_",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "player_kills",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "damage_taken",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "duration",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "items_consumed",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "magical_damage_taken",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "physical_damage_dealt__players_",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "disconnects",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "items_sold",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "physical_damage_taken",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "healing_done",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "matches",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "relic",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "assists",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "largest_kill_streak",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "bots",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "gold",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "largest_multi_kill",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "ping",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "team",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "tribute_kills",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "connects",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "deaths",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "shrine_captures",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "spawns",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "items_bought",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "physical_damage_dealt",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "abandoned",
          "type" : "BOOLEAN"
        },
        { "mode" : "NULLABLE",
          "name" : "damage_dealt",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "damage_dealt__players_",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "level",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "party_muted",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "quests_completed",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "tower_kills",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "victorious",
          "type" : "BOOLEAN"
        },
        { "mode" : "NULLABLE",
          "name" : "name",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "response",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "type",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "currency_type",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "state",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "last_quest",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "product",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "amount",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "platform",
          "type" : "STRING"
        },
        { "mode" : "NULLABLE",
          "name" : "newbie",
          "type" : "BOOLEAN"
        },
        { "mode" : "NULLABLE",
          "name" : "campaign_id",
          "type" : "FLOAT"
        },
        { "mode" : "NULLABLE",
          "name" : "delivery_id",
          "type" : "FLOAT"
        }
      ],
    "mode" : "NULLABLE",
    "name" : "properties",
    "type" : "RECORD"
  },
  { "mode" : "NULLABLE",
    "name" : "event",
    "type" : "STRING"
  }
] }

BigQuery支持向现有表中添加列,但不支持删除现有列


为防止出现显示的错误,在修补表架构时,请始终在新架构中包含现有列,并且仅向其中添加列。

是否尝试删除列?我不尝试删除列。我正在发送一组新的数据,其中有一些额外的列,也有一些原始模式中缺少的列。我相信BigQuery需要我合并模式,以拥有两个模式的超集作为补丁请求的一部分。就是这样!添加答案:)我明白了。然而,这似乎是非常不必要的。它需要应用程序从bigquery中提取模式,并在两个模式上进行嵌套树合并。谷歌api客户端或bq客户端是否支持这种开箱即用?或者合并必须手动完成?据我所知不是这样,但听起来像是一个有趣的特性-您能描述一下您正在更改的模式吗?(似乎它比一张平桌子更复杂)是的。其嵌套的字段树是数组。我想共享一个示例架构,但由于对SO的注释只允许几个字符,因此我已使用该架构编辑了原始问题。BigQuery supoprt是否将数据类型更改为现有表和列?您可以重新具体化该表-如果需要详细答案,请打开一个新问题