Apache IoTDB 系列教程-7:時序數據文件格式 TsFile

在大數據生態中有不少文件格式,像 Parquet,ORC,Avro 等等,都是針對嵌套數據設計的文件格式。這些文件格式廣泛具備預先定義的schema,數據以行式寫入,按屬性組織,列式存儲。可是這些文件格式通常不能很好地知足時間序列數據的管理需求。好比,在一些時間序列數據的場景中,通常各個序列是獨立寫入的,時間戳並不對齊;查詢結果也須要按照時間戳排序。TsFile(Time series File)就是咱們爲時序數據場景設計的文件格式。今天主要介紹用法,主要針對 0.10 版本。html

使用場景

文件格式因爲比較輕量級,適合在邊緣端當作一個數據壓縮包使用,這個邊緣端能夠是設備內部,也能夠是工控機、工廠層級。設備上生成的數據能夠隨時持久化到文件中進行存儲。這裏說的設備可能一臺風機,上邊會有多個測點,好比風速傳感器、溫度傳感器等。每一個傳感器採集的數據就是一個時間序列。聯想的IoT平臺自2017年就開始使用TsFile存儲時序數據。git

所以,TsFile 的目標場景是管理一個或多個設備的時序數據。github

設備-測點模型apache

設備(DeviceId):相似表的概念。微信

測點(MeasurementId):一個設備能夠有多個測點,相似表中的列的概念。ide

時間序列路徑(Path):能夠經過設備和測點定義 Path(設備Id,測點Id)。大數據

測點描述信息(MeasurementSchema):每一個時間序列都對應一個描述信息,包括數據類型、編碼方式、壓縮方式。ui

每一個時間序列都有兩列:時間列、值列。編碼

最近喜歡畫圖,來畫一張,基本就是這樣的,不一樣設備能夠有不一樣的測點。url

註冊元數據

使用 TsFile,第一步就是註冊元數據。

註冊時間序列:Path+MeasurementSchema

能夠經過這種方式把每一個時間序列都註冊進去。

註冊時間序列須要提供一個 Path 和一個 MeasurementSchema 

String path = "test.tsfile";

在 0.10 之前,全部設備都共享一個點表,同名 Measurement 的 schema 也須要同樣(這就是IoTDB裏一個存儲組下同名測點類型須要同樣的限制的來源)。在 0.10 之後,每一個時間序列作到了真正的獨立,互不干擾。

按模板註冊設備:設備模板+設備

上面這樣一條一條註冊比較麻煩,所以提供了一個設備模板的功能。每一個模板定義了一組 MeasurementSchema,好比有10個測點,當一個設備關聯到了這個模板上,就自動註冊出了 10 個序列。

首先生成設備模板,而後註冊模板。

Map<String, MeasurementSchema> template = new HashMap<>();

接下來註冊設備,按模板名關聯到模板上:

tsFileWriter.registerDevice("device_1", "template_1");

這樣,我就註冊了 2 個設備,每一個設備都有 2 個測點。

註冊一個模板,實時寫入數據

這個是高級簡化版。當咱們只註冊了一個設備模板時,能夠不註冊設備,直接寫入數據。寫入流程中若是發現這個設備寫入的數據沒有註冊,會直接到模板裏找同名的 MeasurementSchema 進行註冊。這也是繼承了 0.9 之前版本的優良傳統(0.9之前的版本,TsFile 只能註冊一個模板,而後就能夠寫數據了)。

寫數據

TsFile 的數據寫入有一個限制,每列都須要按照時間遞增寫入,不然不保證正確性。

按設備寫入一行數據:TSRecord

一個 TSRecord 是一個設備,一個時間戳,多個測點的值。相似一個表的一行數據。

按設備寫入一批數據:Tablet

哈哈,又看到了 Tablet,對,這個結構是貫穿 TsFile 和 IoTDB Session 的一個結構。表示一個設備,多個時間戳的多個測點的值,相似一個子表。這個子表不能有空值。

一樣,這種寫入接口速度快,能夠達到每秒千萬點寫入速度。

讀數據

查詢的接口接收一批路徑,一個表達式(能夠進行時間過濾和值過濾),其實就對應了 select  和 where 兩個子句。

在查詢時候,TsFile 的默認表結構是寬表,time, d1.m1, d1.m2, d2.m1, d2.m2。這個結構默認是把給定的查詢 Path 按 Time 作對齊,而且進行條件過濾的。

資料

示例代碼:

https://github.com/apache/incubator-iotdb/blob/master/example/tsfile/

文檔:

http://iotdb.apache.org/zh/UserGuide/V0.10.x/Client/Programming%20-%20TsFile%20API.html

總結

今天介紹了時間序列文件格式 TsFile 的數據模型,元數據註冊,寫入和讀取過程。就到這啦。你們來點 Star 吧!

https://github.com/apache/incubator-iotdb/tree/master

點贊!關注!轉發!

本文分享自微信公衆號 - IoTDB漫遊指南(Apache-IoTDB)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。