1

我正在尝试将从 SELECT 获取的数据附加到另一个现有表,但我不断收到以下错误:

提供的 Schema 与表projectId不匹配:datasetId现有表

这是我的请求正文:

{'projectId': projectId,
 'configuration': {
     'query': {
         'query': query,
         'destinationTable': {
             'projectId': projectId,
                 'datasetId': datasetId,
                 'tableId': tableId
         },
         'writeDisposition': "WRITE_APPEND"
     }
  }
}

似乎writeDisposition选项没有得到评估。

4

3 回答 3

1

为了使追加工作,现有表的架构必须与您要追加的查询结果的架构完全匹配。您能否验证是否是这种情况(检查这一点的一种方法是将此查询保存为表并将架构与您要附加到的表进行比较)。

于 2012-05-10T16:06:20.493 回答
1

好吧,我想我在这里得到了一些东西。这是一个奇怪的...实际上,如果您具有完全相同的模式(字段模式),它就不起作用。

这是源表架构:

 "schema": {
   "fields": [
   {
     "name": "ID_CLIENT",
     "type": "INTEGER",
     "mode": "NULLABLE"
   },
   {
     "name": "IDENTITE",
     "type": "STRING",
     "mode": "NULLABLE"
   }
  ]
  }

如果我使用浏览器界面 (bigquery.cloud.google.com) 中的复制功能,我会得到与预期完全相同的架构:

"schema": {
  "fields": [
  {
    "name": "ID_CLIENT",
    "type": "INTEGER",
    "mode": "NULLABLE"
  },
  {
    "name": "IDENTITE",
    "type": "STRING",
    "mode": "NULLABLE"
  }
  ]
 }

但是我不能从以下提取附加到复制的表:

SELECT ID_CLIENT + 1 AS ID_CLIENT, RIGHT(IDENTITE,12) AS IDENTITE FROM datasetid.client

尽管它返回相同的模式,至少从浏览器界面视图来看,它在内部返回以下模式:

"schema": {
 "fields": [
 {
   "name": "ID_CLIENT",
   "type": "INTEGER",
   "mode": "REQUIRED"
 },
 {
   "name": "IDENTITE",
   "type": "STRING",
   "mode": "NULLABLE"
 }
]

}

这不是完全相同的模式(检查模式)。

更奇怪的是这个选择:

SELECT ID_CLIENT, IDENTITE FROM datasetid.client

返回此架构:

"schema": {
  "fields": [
  {
    "name": "ID_CLIENT",
    "type": "INTEGER",
    "mode": "REQUIRED"
  },
  {
    "name": "IDENTITE",
    "type": "STRING",
    "mode": "REQUIRED"
  }
 ]
}

结论:

不要依赖来自浏览器界面的表模式信息,始终使用 Tables.get API。复制并没有真正按预期工作......

于 2012-05-11T08:40:11.863 回答
1

我已使用 bq 命令行工具成功地将数据从 CSV 文件附加到现有表中。我在这里看到的唯一区别是配置

write_disposition而不是 writeDisposition 如原始问题所示。

我所做的是将附加标志添加到 bq 命令行实用程序(python 脚本)以进行加载,它就像魅力一样工作。

我必须使用以下内容更新 bq.py。

  1. 为加载功能添加了一个名为 --append 的新标志
  2. 在 RunWithArgs 下的 _Load 类中检查是否设置了附加,如果设置了 'write_disposition' = 'WRITE_APPEND'

bq.py 的代码更改如下

在 Class 的__init__函数中_Load添加以下内容

**flags.DEFINE_boolean(
        'append', False,
        'If true then data is appended to the existing table',
        flag_values=fv)**

并在下面的语句之后的类函数RunWithArgs_Load

if self.replace:
      opts['write_disposition'] = 'WRITE_TRUNCATE'

---> 添加以下文字

**if self.append:
      opts['write_disposition'] = 'WRITE_APPEND'**

现在在命令行中

> bq.py --append=true <mydataset>.<existingtable> <filename>.gz

会将压缩(gzipped)csv 文件的内容附加到现有表中。

于 2012-06-04T23:17:31.553 回答