移动消防水带到s3:数据在s3路径中传递到错误的时间

tpgth1q7  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(196)

我正在使用kinesis firehose缓冲物联网数据,并将其写入s3。firehose以以下格式将缓冲区写入s3 s3://bucket.me.com/YYYY/MM/DD/HH 上午10点59分输入的数据可能会被消防水龙带缓冲,直到上午11点才写出( s3://bucket.me.com/2017/03/09/11 ).
问题是,在为雅典娜创建分区时,第10小时的分区不会包含第10小时的所有数据,因为它位于第11小时路径中。
下面的例子可以更好地说明:
iot将以下数据发送到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"}

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

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 分区)。
如何避免这个问题?

ve7v8dk2

ve7v8dk21#

你不能完全避免它,但多写会在适当的时间内产生更准确的结果。

nfzehxib

nfzehxib2#

我想你应该先查询,然后再过滤 select * from sensor_data where (hour = 1 or hour = 2) and date_trunc('hour', dt.hour) = 1

相关问题