2017-03-24 36 views
0

我正在使用Kinesis Firehose缓冲物联网数据,并将其写入s3。流水写入缓存格式s3://bucket.me.com/YYYY/MM/DD/HHKinesis Firehose到s3:将数据传送到s3路径中的错误小时

的数据,在10进来到S3:59A可能会被流水缓冲,而不是写出来的,直到11:00A(s3://bucket.me.com/2017/03/09/11)。

问题是,当为雅典娜创建分区时,小时10的分区将不包含小时10的所有数据,因为它位于小时11的路径中。

这里是一个更好的示出了示例:

IOT中下面的数据发送到流水,这在图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"} 

我然后创建一个雅典娜表:

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点以上的记录返回,因为它只会从读s3路径为分区hour=1定义(并且3个记录确实在hour=2分区中)。

如何避免此问题?

回答

1

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

0

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