TsFile层次结构
这是TsFile文件结构的简要介绍。
可变存储
Big Endian
- 例如,
int
0x8
将被存储为00 00 00 08
,而不是08 00 00 00
。
- 例如,
可变长度的字符串
格式为
int size
加String literal
. 大小可以为零。大小等于此字符串将占用的字节数,并且可能不等于该字符串的长度。
例如,“ sensor_1”将被存储为
00 00 00 08
加上“ sensor_1”的编码(ASCII)。请注意,对于“魔术字符串”(文件签名)“ TsFilev0.8.0”,大小(12)和编码(ASCII)是固定的,因此无需在该字符串文字前放置大小。
数据类型硬编码
- 0: BOOLEAN
- 1: INT32 (
int
) - 2: INT64 (
long
) - 3: FLOAT
- 4: DOUBLE
- 5: TEXT (
String
)
编码类型硬编码
- 0: PLAIN
- 1: PLAIN_DICTIONARY
- 2: RLE
- 3: DIFF
- 4: TS_2DIFF
- 5: BITMAP
- 6: GORILLA
- 7: REGULAR
压缩类型硬编码
- 0: UNCOMPRESSED
- 1: SNAPPY
TsFile概述
这是有关TsFile结构的图。
魔术字符串
有一个12个字节的魔术字符串:
TsFilev0.8.0
它在TsFile文件的开头和结尾都作为签名。
数据
TsFile文件的内容可以分为两部分:数据和元数据。 数据和元数据之间有一个字节“ 0x02”作为标记。
数据部分是ChunkGroup
的数组,每个ChuckGroup代表一个* device *。
ChuckGroup
ChunkGroup
具有一个Chunk
数组,一个后继字节0x00
作为标记以及一个ChunkFooter
。
Chunk
Chunk
代表传感器。 在ChunkHeader
和Page
数组之后,有一个字节0x01
作为标记。
ChunkHeader
Member Description | Member Type |
---|---|
The name of this sensor(measurementID) | String |
Size of this chunk | int |
Data type of this chuck | short |
Number of pages | int |
Compression Type | short |
Encoding Type | short |
Max Tombstone Time | long |
Page
Page
代表Chunk
中的一些数据。 它包含一个PageHeader
和实际数据(编码的时间值对)。
PageHeader结构
Member Description | Member Type |
---|---|
Data size before compressing | int |
Data size after compressing(if use SNAPPY) | int |
Number of values | int |
Minimum time stamp | long |
Maximum time stamp | long |
Minimum value of the page | Type of the page |
Maximum value of the page | Type of the page |
First value of the page | Type of the page |
Last value of the page | Type of the page |
Sum of the Page | double |
ChunkGroupFooter
Member Description | Member Type |
---|---|
Deviceid | String |
Data size of the ChunkGroup | long |
Number of chunks | int |
元数据
TsDeviceMetaData
元数据的第一部分是TsDeviceMetaData
Member Description | Member Type |
---|---|
Start time | long |
End time | long |
Number of chunk groups | int |
然后在TsDeviceMetaData
之后有一个ChunkGroupMetaData
数组。
ChunkGroupMetaData
Member Description | Member Type |
---|---|
Deviceid | String |
Start offset of the ChunkGroup | long |
End offset of the ChunkGroup | long |
Version | long |
Number of ChunkMetaData | int |
然后,每个ChunkGroupMetadata
都有一个ChunkMetadata
数组。
ChunkMetaData
Member Description | Member Type |
---|---|
Measurementid | String |
Start offset of ChunkHeader | long |
Number of data points | long |
Start time | long |
End time | long |
Data type | short |
Number of statistics | int |
The statistics of this chunk | TsDigest |
TsDigest
有五个统计信息: min, last, sum, first, max
存储格式是名称/值对。 名称是一个字符串(记住长度在文字之前)。
但是对于该值,即使不是字符串,在数据前也有一个大小整数。 例如,如果min
为3,则它将被存储为3“ min” 4 3在TsFile中。
File Metadata
在ChunkGroupMetadata
数组之后,这是元数据的最后一部分。
Member Description | Member Type |
---|---|
Number of Devices | int |
Array of DeviceIndexMetadata | DeviceIndexMetadata |
Number of Measurements | int |
Array of Measurement name and schema | String, MeasurementSchema pair |
Current Version(3 for now) | int |
Author byte | byte |
Author(if author byte is 0x01) | String |
File Metadata size(not including itself) | int |
DeviceIndexMetadata
Member Description | Member Type |
---|---|
Deviceid | String |
Start offset of ChunkGroupMetaData(Or TsDeviceMetaData if it’s the first one) | long |
length | int |
Start time | long |
End time | long |
MeasurementSchema
Member Description | Member Type |
---|---|
Measurementid | String |
Data type | short |
Encoding | short |
Compressor | short |
Size of props | int |
如果道具的大小大于0,则存在一个
完成
在FileMetaData
之后,将有另一个魔术字符串,您已经完成了发现TsFile的旅程!
您也可以使用/ tsfile / example / TsFileSequenceRead来读取和验证TsFile。