TsFile层次结构

这是TsFile文件结构的简要介绍。

可变存储

  • Big Endian

    • 例如,int 0x8将被存储为00 00 00 08,而不是08 00 00 00
  • 可变长度的字符串

    • 格式为 int sizeString 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结构的图。

TsFile Breakdown

魔术字符串

有一个12个字节的魔术字符串:

TsFilev0.8.0

它在TsFile文件的开头和结尾都作为签名。

数据

TsFile文件的内容可以分为两部分:数据和元数据。 数据和元数据之间有一个字节“ 0x02”作为标记。

数据部分是ChunkGroup的数组,每个ChuckGroup代表一个* device *。

ChuckGroup

ChunkGroup具有一个Chunk数组,一个后继字节0x00作为标记以及一个ChunkFooter

Chunk

Chunk代表传感器。 在ChunkHeaderPage数组之后,有一个字节0x01作为标记。

ChunkHeader
Member DescriptionMember Type
The name of this sensor(measurementID)String
Size of this chunkint
Data type of this chuckshort
Number of pagesint
Compression Typeshort
Encoding Typeshort
Max Tombstone Timelong
Page

Page代表Chunk中的一些数据。 它包含一个PageHeader和实际数据(编码的时间值对)。

PageHeader结构

Member DescriptionMember Type
Data size before compressingint
Data size after compressing(if use SNAPPY)int
Number of valuesint
Minimum time stamplong
Maximum time stamplong
Minimum value of the pageType of the page
Maximum value of the pageType of the page
First value of the pageType of the page
Last value of the pageType of the page
Sum of the Pagedouble
ChunkGroupFooter
Member DescriptionMember Type
DeviceidString
Data size of the ChunkGrouplong
Number of chunksint

元数据

TsDeviceMetaData

元数据的第一部分是TsDeviceMetaData

Member DescriptionMember Type
Start timelong
End timelong
Number of chunk groupsint

然后在TsDeviceMetaData之后有一个ChunkGroupMetaData数组。

ChunkGroupMetaData

Member DescriptionMember Type
DeviceidString
Start offset of the ChunkGrouplong
End offset of the ChunkGrouplong
Versionlong
Number of ChunkMetaDataint

然后,每个ChunkGroupMetadata都有一个ChunkMetadata数组。

ChunkMetaData
Member DescriptionMember Type
MeasurementidString
Start offset of ChunkHeaderlong
Number of data pointslong
Start timelong
End timelong
Data typeshort
Number of statisticsint
The statistics of this chunkTsDigest
TsDigest

有五个统计信息: min, last, sum, first, max

存储格式是名称/值对。 名称是一个字符串(记住长度在文字之前)。

但是对于该值,即使不是字符串,在数据前也有一个大小整数。 例如,如果min为3,则它将被存储为3“ min” 4 3在TsFile中。

File Metadata

ChunkGroupMetadata数组之后,这是元数据的最后一部分。

Member DescriptionMember Type
Number of Devicesint
Array of DeviceIndexMetadataDeviceIndexMetadata
Number of Measurementsint
Array of Measurement name and schemaString, MeasurementSchema pair
Current Version(3 for now)int
Author bytebyte
Author(if author byte is 0x01)String
File Metadata size(not including itself)int
DeviceIndexMetadata
Member DescriptionMember Type
DeviceidString
Start offset of ChunkGroupMetaData(Or TsDeviceMetaData if it’s the first one)long
lengthint
Start timelong
End timelong
MeasurementSchema
Member DescriptionMember Type
MeasurementidString
Data typeshort
Encodingshort
Compressorshort
Size of propsint

如果道具的大小大于0,则存在一个对数组,作为此度量的属性。 ​ 例如“ max_point_number”“ 2”。

完成

FileMetaData之后,将有另一个魔术字符串,您已经完成了发现TsFile的旅程!

您也可以使用/ tsfile / example / TsFileSequenceRead来读取和验证TsFile。