BigQuery:从CSV加载,跳过列

5 投票
2 回答
8109 浏览
提问于 2025-04-20 13:52

假设我有一个包含已有数据的表格,结构大概是这样的:

{ '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 上。

在此之前,我建议你分两步来导入数据:

  1. 先把数据作为一个新表导入,包含3列。
  2. 然后把“SELECT column1, column2 FROM [newtable]”的结果追加到已有的表里。

撰写回答