Kinesis Firehose to s3: данные доставлены в неправильный час на пути s3

Я использую Kinesis Firehose для буферизации данных IoT и записываю их в s3. Firehose записывает буферы в s3 в формате s3://bucket.me.com/YYYY/MM/DD/HH

Данные, поступающие в 10:59, могут быть буферизованы Firehose и не записываться до 11:00 (s3://bucket.me.com/2017/03/09/11).

Проблема в том, что при создании разделов для Athena раздел для 10-го часа не будет содержать все данные для 10-го часа, потому что он находится на пути 11-го часа.

Вот пример, который лучше иллюстрирует:

IoT отправляет следующие данные в 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 записи выше, потому что он будет читать только из пути s3, определенного для раздела hour=1 (и 3 записи действительно находятся в разделе hour=2).

Как избежать этой проблемы?


person rynop    schedule 24.03.2017    source источник


Ответы (2)


Вы не можете полностью избежать этого, но если писать чаще, это даст более точные результаты в соответствующий час.

person Jeremy McJunkin    schedule 24.03.2017

Я думаю, вы захотите сделать более широкий запрос, а затем повторно отфильтровать select * from sensor_data where (hour = 1 or hour = 2) and date_trunc('hour', dt.hour) = 1 .

person jdwyah    schedule 04.07.2017