s3 select where子句时如何解决“ MissingHeaders”错误

时间:2019-08-13 11:07:19

标签: python-2.7 amazon-s3 boto3

我有一个csv文件,格式为

IDATE_TIMESTAMP,OPEN,HIGH,LOW,CLOSE,VOLUME
1535535060,94.36,94.36,94.36,94.36,1
1535535120,94.36,94.36,93.8,93.8,1
1535535180,93.8,93.8,93.8,93.8,0
1535535240,93.8,93.8,93.74,93.74,1
1535535300,93.74,93.74,93.74,93.74,0
1535535360,93.74,93.74,93.74,93.74,0
1535535420,93.74,93.74,93.74,93.74,0
1535535480,93.74,93.74,93.74,93.74,0
1535535540,93.74,93.74,93.74,93.74,0
.
.
.
.

我必须往返于时间戳,它将从文件中过滤出数据并返回输出。我正在使用python + boto3进行s3选择。

fromTs = "1535535480"
toTs = "1535535480"
query = """SELECT * FROM s3object s WHERE s."IDATE_TIMESTAMP" >= "%s" AND s."IDATE_TIMESTAMP" <= "%s" """%(fromTs, toTs)
request = client.select_object_content(
        Bucket=bucket,
        Key=filename,
        ExpressionType="SQL",
        Expression=query,
        InputSerialization={"CSV":{"FileHeaderInfo":"Use", "FieldDelimiter":",", "RecordDelimiter":"\n"}},
        OutputSerialization={"CSV":{}},
    )

botocore.exceptions.ClientError:调用SelectObjectContent操作时发生错误(MissingHeaders):文件中缺少查询中的某些标头。请检查文件,然后重试。

这是我得到的错误

1 个答案:

答案 0 :(得分:0)

我知道这有点晚了,可能无法解决您的问题,但是我也遇到了类似的情况。

原来,我的问题是我试图对使用UTF-8-BOM编码而不是UTF-8编码的对象执行S3 Select。原来,3字节BOM表头被解释为CSV对象第一个字段的一部分,实质上破坏了第一列名称。

因此,S3 Select调用将第一列而不是“ IDATE_TIMESTAMP”显示为“ xxxIDATE_TIMESTAMP”,当您期望的列“缺失”时会导致错误。