【问题标题】:How to fix "MissingHeaders" Error while appending where clause with s3 select如何在使用 s3 select 附加 where 子句时修复“MissingHeaders”错误
【发布时间】:2019-12-19 22:26:19
【问题描述】:

我有一个格式为 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):文件中缺少查询中的某些标头。请检查文件并重试。

这是我遇到的错误

【问题讨论】:

    标签: python-2.7 amazon-s3 boto3


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      时间戳列需要转换为 int。 以下查询:

      fromTs = 1535535480
      toTs = 1535535480
      
      SELECT * FROM s3object s 
      where cast(s.IDATE_TIMESTAMP as int) >= {} 
      AND cast(s.IDATE_TIMESTAMP as int) <= {}".format(fromTs, toTs) 
      

      可以在 python 3 中使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-19
        • 2018-04-14
        相关资源
        最近更新 更多