TSM文件格式及实例解析(三)——多field的排列
上一篇解析了多series的情况,得出结论为indexes和blocks 同一顺序存储,block内部timestamp和value也是列式存储。
今天探究一下多field是如何排列的。
数据
先构造一组数据
insert cars,brand=honda,model=fit mileage=10000,speed=60 1535354189281011006
insert cars,brand=bmw,model=320li mileage=2000,speed=100 1535354189281012006
insert cars,brand=bmw,model=x5 mileage=2300,speed=101 1535354189281013006
insert cars,brand=bmw,model=x5 mileage=2400,speed=103 1535354189281014006
insert cars,brand=bmw,model=x5 mileage=2500,speed=102 1535354189281015006
insert cars,brand=bmw,model=x5 mileage=2600,speed=26 1535354189281016006
insert cars,brand=bmw,model=x5 mileage=2700 1535354189281017006
insert cars,brand=bmw,model=x5 mileage=2800,speed=0 1535354189281018006
insert cars,brand=bmw,model=x5 mileage=2900 1535354189281019006
> show measurements
name: measurements
name
----
cars
> show series from car
> show series from cars
key
---
cars,brand=bmw,model=320li
cars,brand=bmw,model=x5
cars,brand=honda,model=fit
>
>
> select * from cars
name: cars
time brand mileage model speed
---- ----- ------- ----- -----
1535354189281011006 honda 10000 fit 60
1535354189281012006 bmw 2000 320li 100
1535354189281013006 bmw 2300 x5 101
1535354189281014006 bmw 2400 x5 103
1535354189281015006 bmw 2500 x5 102
1535354189281016006 bmw 2600 x5 26
1535354189281017006 bmw 2700 x5
1535354189281018006 bmw 2800 x5 0
1535354189281019006 bmw 2900 x5
继续之前的基础重新构造数据,多加了一个speed field, 且有的points有,有的points没有。
生成数据:
数据分析:
Indexes
从Indexes开始,offset 0xEE
发现indexes增多了, 每个index里面的key都是一个series + 一个field.
num of keys = num of series1's fields + num of series2's fileds +....
Blocks
blocks和indexes目前还是一一对应关系,保持列式结构。
但是block4 出了一点状况,因为block4中的timestamp间隔不是完全一致的。
key: cars,brand=bmw,model=x5#!~#speed
它的timestamp为
1535354189281013006
1535354189281014006
1535354189281015006
1535354189281016006
1535354189281018006
这里timestamp用的PackedSimple-s8b的压缩算法,这个比RLE要多花许多bytes.不过这个算法尚未深究,但是解码出来的timestamp依旧保持和value一样顺序,不影响列式结构。
结论:
每个index只能包含一个field.. 对于多field的情况,将产生更多的indexes(keys)
小结:
下一步将探寻多field,多重类型数据组合,看看结构有没有的新发现。