假设我有一个包含现有数据的表,其架构如下:
{ 'name' : 'Field1', 'type' : 'STRING' },
{ 'name' : 'Field2', 'type' : 'STRING' }
我们的数据是CSV:
Field1,Field2
Value1,Value2
...
我们通过创建新作业来加载数据,直接从Google云端存储(GCS)加载CSV。我们的数据文件现在有一个额外的列和不同的顺序,这样数据现在就构成了:
Field1,Field3,Field2
Value1,Value3,Value2
...
有没有办法在加载作业中指定我们要跳过第二列,只加载第1列和第3列(名为Field1和Field2)?
我正在使用Python API,例如service.jobs()。insert(job_body)
基本上我想做这样的事情:
job_body = {
'projectId': projectId,
'configuration': {
'load': {
'sourceUris': [sourceCSV],
'schema': {
'fields': [
{
'name': 'Field1',
'type': 'STRING'
},
{ # this would be the skipped field
'name': None
'skip': True
},
{
'name': 'Field2',
'type': 'String'
},
]
},
'destinationTable': {
'projectId': projectId,
'datasetId': datasetId,
'tableId': targetTableId
},
}
}
}
谢谢!
答案 0 :(得分:4)
费利佩的建议应该有效。如果您能够修改已加载到BigQuery中的CSV,则另一种可能性是加载作业上的ignoreUnknownValues标记:
[可选]接受包含与架构不匹配的值的行。未知值将被忽略。默认值为false,将未知值视为错误。对于CSV,这会忽略行尾的额外值。对于JSON,这将忽略与任何列名称都不匹配的命名值。
但是,使用此标记需要重新排序CSV中的列或将数据格式化为JSON。
答案 1 :(得分:2)
目前无法做到这一点,但它可能是一个有趣的功能请求。随意将其添加到https://code.google.com/p/google-bigquery/issues/list。
与此同时,我会做两步导入: