Skip to content

MathMiner419/time_normalization

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

时间索引编码

解决问题:

在数据仓库(hadoop->hive etc.)表和表做业务join,连接字段就比较复杂,如果需要对相似时间delta T时间范围内做时间方向上统一,不好做,基于Mapreduce是可以的,对reduce line by line去过时间片就可以搞定,但是对于hive等数据仓库,基于sql,需要join字段,但是 空间 时间等,难以做相似位置,或者相似时间的统一和归一化。

算法参考:geohash 对空间做的索引编码

此项目实现:对时间的空间索引和归一化 可以将相似时间  如时间间隔 3s/50s/3min/...等时间跨度范围做数值上的统一。由于时间是不收敛的,不像longitude或者latitude有限制,所以我们采用100年的这样的限制方案,二进制编码的范围采用1970~2070年timestamp的方式。



algorithm is refereneced by https://en.wikipedia.org/wiki/Geohash

=============================================================================
正规化

取后N位不一致
3s  ->  后2bit  2^2*0.734   --> 前15位相同
12s ->  后4bit  2^4*0.734   --> 前14位相同
50s ->  后6bit 2^6*0.734   --> 前13位相同
3min -> 后8bit  2^8*0.734   --> 前12位相同
12min -> 后10bit 2^10*0.734 --> 前11位相同
50min -> 后12bit 2^12*0.734 --> 前10位相同
200min -> 后14bit 2^14*0.734 --> 前9位相同
13.3h -> 后16bit 2^16*0.734 --> 前8位相同
...

对时间戳归一化到 一共16位的base4字符串


-- 详情参考单元测试 整体采用base4 encode.
样例:
assertEquals("1321223233000000", timeNor.normalize(1499999777l));
assertEquals("1321223233010233", timeNor.normalize(1500000000l));
assertEquals("1321223233010302", timeNor.normalize(1500000002l));
assertEquals("1321223233010331", timeNor.normalize(1500000010l));

-- 同样支持标准16位base4 timeHash转为位10位时间戳
// delta T < 1s | double * 2^32 might be error
assertEquals(1499999777l, timeNor.deNormalize("1321223233000000").longValue(), 1);

方法提供带precision的时间点左右deltaT的timeHash范围数值 --详情还是参考单元测试
样例:
   13311303 deltaT <- 13311310 -> deltaT 13311311

About

时间索引编码 解决时间区间范围内的正规化、归一化问题 timehash

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages