将数据从SELECT附加到现有表

时间:2012-05-10 14:43:40

标签: google-bigquery

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

提供的架构与表 projectId datasetId 不匹配。 existingTable

这是我的请求正文:

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

似乎 writeDisposition 选项未被评估。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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。 复制并没有按预期正常工作......

答案 2 :(得分:1)

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

write_disposition ,而不是原始问题中显示的writeDisposition。

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

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

  1. 添加了一个名为--append for load function
  2. 的新标志 在RunWithArgs下的_Load类中检查
  3. ,看是否设置了append,如果这样设置'write_disposition'='WRITE_APPEND'
  4. bq.py的代码更改如下

    __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文件的内容追加到现有表中。