1

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

示例:csv 文件

美国广播公司

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}]

这是我用来查询的 params 对象:

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

4

2 回答 2

1

所以看起来,在从 s3 获取查询结果时,也无法获取标题。我们可以使用 headerNames 或 columnNumber 进行查询,但是如果我们使用 where 子句,那么我们应该使用 headerNames,在这种情况下,标题行不会出现在结果中。

所以,我现在已经硬编码了我调用 s3 选择查询的 api 调用中的标头,并将这些标头附加到结果中。

于 2020-05-23T04:24:13.187 回答
0

更改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: {}
  }
};
于 2020-05-20T15:28:18.360 回答