BigQuery:从CSV加载,跳过列
假设我有一个包含已有数据的表格,结构大概是这样的:
{ 'name' : 'Field1', 'type' : 'STRING' },
{ 'name' : 'Field2', 'type' : 'STRING' }
我们的数据是CSV格式:
Field1,Field2
Value1,Value2
...
我们通过创建一个新任务来加载数据,直接从Google云存储(GCS)中加载CSV文件。现在我们的数据文件多了一列,顺序也变了,所以数据的结构变成了:
Field1,Field3,Field2
Value1,Value3,Value2
...
有没有办法在加载任务中指定跳过第二列,只加载第一列和第三列(分别叫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
},
}
}
}
谢谢!
2 个回答
4
Felipe的建议应该是可行的。还有一种可能性,如果你能修改加载到BigQuery中的CSV文件,可以使用一个叫做 ignoreUnknownValues 的选项:
[可选] 接受那些包含与模式不匹配的值的行。未知的值会被忽略。默认情况下是false,这意味着未知值会被当作错误处理。对于CSV文件,这会忽略行末尾的多余值。对于JSON格式,这会忽略那些没有对应列名的命名值。
不过,使用这个选项的话,你需要重新排列CSV文件中的列,或者把数据格式化成JSON。
3
现在还不能做到这一点,不过这可以是一个有趣的功能建议。你可以把这个建议加到 https://code.google.com/p/google-bigquery/issues/list 上。
在此之前,我建议你分两步来导入数据:
- 先把数据作为一个新表导入,包含3列。
- 然后把“SELECT column1, column2 FROM [newtable]”的结果追加到已有的表里。