Kinesis Firehose到s3:数据在s3路径中传送到错误的小时

时间:2017-03-24 02:37:45

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

我使用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路径中。

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

IoT将以下数据发送给Firehose,Firehose将其写入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分区)。

如何避免此问题?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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