BigQuery:从CSV加载,跳过列

时间:2014-09-08 23:33:49

标签: python csv google-bigquery

假设我有一个包含现有数据的表,其架构如下:

{ '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
        },
      }
    }
  }

谢谢!

2 个答案:

答案 0 :(得分:4)

费利佩的建议应该有效。如果您能够修改已加载到BigQuery中的CSV,则另一种可能性是加载作业上的ignoreUnknownValues标记:

  

[可选]接受包含与架构不匹配的值的行。未知值将被忽略。默认值为false,将未知值视为错误。对于CSV,这会忽略行尾的额外值。对于JSON,这将忽略与任何列名称都不匹配的命名值。

但是,使用此标记需要重新排序CSV中的列或将数据格式化为JSON。

答案 1 :(得分:2)

目前无法做到这一点,但它可能是一个有趣的功能请求。随意将其添加到https://code.google.com/p/google-bigquery/issues/list

与此同时,我会做两步导入:

  1. 导入为包含3列的新表。
  2. 将“SELECT column1,column2 FROM [newtable]”追加到现有表中。