Kinesis Firehose 到 s3:数据传送到 s3 路径中的错误时间
Kinesis Firehose to s3: data delivered to wrong hour in s3 path
我正在使用 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 table:
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
分区中)。
如何避免这个问题?
您无法完全避免它,但更频繁地写入会在适当的时间产生更准确的结果。
我想你会想要查询更广泛然后重新过滤
select * from sensor_data
where (hour = 1 or hour = 2)
and date_trunc('hour', dt.hour) = 1
我正在使用 Kinesis Firehose 缓冲 IoT 数据,并将其写入 s3。 Firehose 以 s3://bucket.me.com/YYYY/MM/DD/HH
进入 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 table:
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
分区中)。
如何避免这个问题?
您无法完全避免它,但更频繁地写入会在适当的时间产生更准确的结果。
我想你会想要查询更广泛然后重新过滤
select * from sensor_data
where (hour = 1 or hour = 2)
and date_trunc('hour', dt.hour) = 1