我有一个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):文件中缺少查询中的某些标头。请检查文件,然后重试。
这是我得到的错误
答案 0 :(得分:0)
我知道这有点晚了,可能无法解决您的问题,但是我也遇到了类似的情况。
原来,我的问题是我试图对使用UTF-8-BOM编码而不是UTF-8编码的对象执行S3 Select。原来,3字节BOM表头被解释为CSV对象第一个字段的一部分,实质上破坏了第一列名称。
因此,S3 Select调用将第一列而不是“ IDATE_TIMESTAMP”显示为“ xxxIDATE_TIMESTAMP”,当您期望的列“缺失”时会导致错误。