我正在尝试将从SELECT中提取的数据附加到另一个现有表中,但我不断收到以下错误:
提供的架构与表 projectId : datasetId 不匹配。 existingTable
这是我的请求正文:
{'projectId': projectId,
'configuration': {
'query': {
'query': query,
'destinationTable': {
'projectId': projectId,
'datasetId': datasetId,
'tableId': tableId
},
'writeDisposition': "WRITE_APPEND"
}
}
}
似乎 writeDisposition 选项未被评估。
答案 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.
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文件的内容追加到现有表中。