在 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 进行了硬编码,并将它们附加到结果中。
我正在使用 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 进行了硬编码,并将它们附加到结果中。