-
Notifications
You must be signed in to change notification settings - Fork 0
时间索引编码 解决时间区间范围内的正规化、归一化问题 timehash
License
MathMiner419/time_normalization
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
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 0
No packages published