我正在使用Kinesis Firehose缓冲物联网数据,并将其写入s3。流水写入缓存格式s3://bucket.me.com/YYYY/MM/DD/HH
Kinesis 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
分区中)。
如何避免此问题?