【问题标题】:Kinesis Firehose to s3: data delivered to wrong hour in s3 pathKinesis Firehose 到 s3:数据在 s3 路径中传送到错误的时间
【发布时间】:2017-03-24 02:37:44
【问题描述】:

我正在使用 Kinesis Firehose 缓冲 IoT 数据,并将其写入 s3。 Firehose 以 s3://bucket.me.com/YYYY/MM/DD/HH 格式将缓冲区写入 s3

10:59a 传入的数据可能会被 Firehose 缓冲,直到 11:00a (s3://bucket.me.com/2017/03/09/11) 才被写入。

问题是,在为 Athena 创建分区时,第 10 小时的分区不会包含第 10 小时的所有数据,因为它位于第 11 小时的路径中。

这是一个更好地说明的例子:

物联网将以下数据发送到 Firehose,Firehose 在 2a 将其写入s3://bucket.me.com/2017/03/24/02/file-0000。文件内容如下所示:

{"id":1,"dt":"2017-03-24 01:59:40"}
{"id":2,"dt":"2017-03-24 01:59:41"}
{"id":3,"dt":"2017-03-24 01:59:42"}

然后我创建一个 Athena 表:

CREATE EXTERNAL TABLE sensor_data (
    id string,
    dt timestamp)
PARTITIONED BY (year int, month int, day int, hour int)
ROW FORMAT  serde 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://bucket.me.com/';

ALTER TABLE sensor_data ADD PARTITION (year=2017,month=3,day=24,hour=1) location 's3://bucket.me.com/2017/03/24/01/';
ALTER TABLE sensor_data ADD PARTITION (year=2017,month=3,day=24,hour=2) location 's3://bucket.me.com/2017/03/24/02/';

当我运行 select * from sensor_data where hour = 1 时,我不会返回上面的 3 条记录,因为它只会从为分区 hour=1 定义的 s3 路径中读取(并且这 3 条记录实际上在 hour=2 分区中)。

如何避免这个问题?

【问题讨论】:

    标签: hive amazon-kinesis amazon-athena amazon-kinesis-firehose


    【解决方案1】:

    你不能完全避免它,但更频繁地写作会在适当的时间产生更准确的结果。

    【讨论】:

      【解决方案2】:

      我认为您会想要更广泛地查询,然后重新过滤 select * from sensor_data where (hour = 1 or hour = 2) and date_trunc('hour', dt.hour) = 1

      【讨论】:

        猜你喜欢
        • 2016-02-03
        • 2018-04-02
        • 2020-10-07
        • 1970-01-01
        • 2020-07-14
        • 1970-01-01
        • 2020-02-08
        • 2021-06-15
        • 2021-11-05
        相关资源
        最近更新 更多