在 s3 select nodejs 中查询 header

Query header in s3 select nodejs

我正在使用 s3 select 查询和 where 子句从 s3 检索数据。 当没有 where 子句时,查询工作正常并返回预期结果。虽然当我使用 where 子句时,过滤的数据是正确的,但是 object 中的键是 header 之后的第一行而不是 header.

示例:csv 文件

A B C

1 2 3

1 5 6

查询:select * from s3object s where s._1 = '1' limit 100

预期输出:[{A : 1, B:2, C:3}, {A:1, B:5, C:6}]

实际输出:[{1:1, 2:5, 3:6}]

这是我用来查询的参数object:

let params = {
    Bucket: S3_BUCKET,
    Key: S3_PATH,
    Expression: "select * from s3object s where s._1 = '1' limit 100"
    ExpressionType: "SQL",
    InputSerialization: {
      CSV: {
        FileHeaderInfo: "NONE",
        RecordDelimiter: "\n",
        FieldDelimiter: ","
      }
    },
    OutputSerialization: {
      CSV: {}
    }
  };

即使我使用 FileHeaderInfo : "USE" 也会得到相同的输出,并将查询更改为 select * from s3object s where id = '22' and s.date > '2020-05-01' limit 100

AWS 文档:https://docs.aws.amazon.com/AmazonS3/latest/API/API_SelectObjectContent.html

params 更改为以下应该有效。

let params = {
  Bucket: S3_BUCKET,
  Key: S3_PATH,
  ExpressionType: "SQL",
  Expression: "select * from s3object s where s.A = '1' limit 100"
  InputSerialization: {
    CSV: {
      FileHeaderInfo: "USE",
      RecordDelimiter: "\n",
      FieldDelimiter: ","
    }
  },
  OutputSerialization: {
    JSON: {}
  }
};

看来,从s3中获取查询结果的同时,不可能也获取到header。我们可以使用 headerNames 查询,或者使用 columnNumber,但是如果我们使用 where 子句,那么我们应该使用 headerNames,在这种情况下,header 行不会出现在结果中。

所以,我现在已经在我调用 s3 select 查询的 api 调用中对 header 进行了硬编码,并将它们附加到结果中。