blob: 2aff2be0cd1db458dacf43ecda5b6b20607984d1 [file] [log] [blame]
(window.webpackJsonp=window.webpackJsonp||[]).push([[423],{989:function(s,t,e){"use strict";e.r(t);var a=e(69),n=Object(a.a)({},(function(){var s=this,t=s.$createElement,e=s._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[e("h1",{attrs:{id:"tsfile-api"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#tsfile-api"}},[s._v("#")]),s._v(" TsFile API")]),s._v(" "),e("p",[s._v("TsFile 是在 IoTDB 中使用的时间序列的文件格式。在这个章节中,我们将介绍这种文件格式的用法。")]),s._v(" "),e("h2",{attrs:{id:"安装-tsfile-libaray"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#安装-tsfile-libaray"}},[s._v("#")]),s._v(" 安装 TsFile libaray")]),s._v(" "),e("p",[s._v("在您自己的项目中有两种方法使用 TsFile .")]),s._v(" "),e("ul",[e("li",[e("p",[s._v("使用 jar 包:")]),s._v(" "),e("ul",[e("li",[e("p",[s._v("编译源码生成 jar 包")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("git clone https://github.com/apache/iotdb.git\ncd tsfile/\nmvn clean package -Dmaven.test.skip=true\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br")])]),e("p",[s._v("命令执行完成之后,所有的 jar 包都可以从 "),e("code",[s._v("target/")]),s._v(" 目录下找到。之后您可以在自己的工程中倒入 "),e("code",[s._v("target/tsfile-0.11.1-jar-with-dependencies.jar")]),s._v(".")])])])]),s._v(" "),e("li",[e("p",[s._v("使用 Maven 依赖:")]),s._v(" "),e("p",[s._v("编译源码并且部署到您的本地仓库中需要 3 步:")]),s._v(" "),e("ul",[e("li",[e("p",[s._v("下载源码")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("git clone https://github.com/apache/iotdb.git\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])])]),s._v(" "),e("li",[e("p",[s._v("编译源码和部署到本地仓库")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("cd tsfile/\nmvn clean install -Dmaven.test.skip=true\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])])]),s._v(" "),e("li",[e("p",[s._v("在您自己的工程中增加依赖:")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v(" <dependency>\n <groupId>org.apache.iotdb</groupId>\n <artifactId>tsfile</artifactId>\n <version>0.11.1</version>\n </dependency>\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br")])])])]),s._v(" "),e("p",[s._v("或者,您可以直接使用官方的 Maven 仓库:")]),s._v(" "),e("ul",[e("li",[e("p",[s._v("首先,在"),e("code",[s._v("${username}\\.m2\\settings.xml")]),s._v("目录下的"),e("code",[s._v("settings.xml")]),s._v("文件中"),e("code",[s._v("<profiles>")]),s._v("\n节中增加"),e("code",[s._v("<profile>")]),s._v(",内容如下:")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v(" <profile>\n <id>allow-snapshots</id>\n <activation><activeByDefault>true</activeByDefault></activation>\n <repositories>\n <repository> \n <id>apache.snapshots</id>\n <name>Apache Development Snapshot Repository</name>\n <url>https://repository.apache.org/content/repositories/snapshots/</url>\n <releases>\n <enabled>false</enabled>\n </releases>\n <snapshots>\n <enabled>true</enabled>\n </snapshots>\n </repository>\n </repositories>\n </profile>\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br"),e("span",{staticClass:"line-number"},[s._v("9")]),e("br"),e("span",{staticClass:"line-number"},[s._v("10")]),e("br"),e("span",{staticClass:"line-number"},[s._v("11")]),e("br"),e("span",{staticClass:"line-number"},[s._v("12")]),e("br"),e("span",{staticClass:"line-number"},[s._v("13")]),e("br"),e("span",{staticClass:"line-number"},[s._v("14")]),e("br"),e("span",{staticClass:"line-number"},[s._v("15")]),e("br"),e("span",{staticClass:"line-number"},[s._v("16")]),e("br"),e("span",{staticClass:"line-number"},[s._v("17")]),e("br")])])]),s._v(" "),e("li",[e("p",[s._v("之后您可以在您的工程中增加如下依赖:")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v(" <dependency>\n <groupId>org.apache.iotdb</groupId>\n <artifactId>tsfile</artifactId>\n <version>0.11.1</version>\n </dependency>\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br")])])])])])]),s._v(" "),e("h2",{attrs:{id:"tsfile-的使用"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#tsfile-的使用"}},[s._v("#")]),s._v(" TSFile 的使用")]),s._v(" "),e("p",[s._v("本章节演示TsFile的详细用法。")]),s._v(" "),e("h3",{attrs:{id:"时序数据-time-series-data"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#时序数据-time-series-data"}},[s._v("#")]),s._v(" 时序数据(Time-series Data)")]),s._v(" "),e("p",[s._v("一个时序是由4个序列组成,分别是 device, measurement, time, value。")]),s._v(" "),e("ul",[e("li",[e("p",[e("strong",[s._v("measurement")]),s._v(": 时间序列描述的是一个物理或者形式的测量(measurement),比如:城市的温度,一些商品的销售数量或者是火车在不同时间的速度。\n传统的传感器(如温度计)也采用单次测量(measurement)并产生时间序列,我们将在下面交替使用测量(measurement)和传感器。")])]),s._v(" "),e("li",[e("p",[e("strong",[s._v("device")]),s._v(": 一个设备指的是一个正在进行多次测量(产生多个时间序列)的实体,例如,\n​ ​ ​ 一列正在运行的火车监控它的速度、油表、它已经运行的英里数,当前的乘客每个都被传送到一个时间序列。")])])]),s._v(" "),e("p",[s._v('表1描述了一组时间序列数据。下表中显示的集合包含一个名为 "device_1" 的设备,它有三个测量值(measurement)分别是\n"sensor_1", "sensor_2" 和 "sensor_3".')]),s._v(" "),e("center",[e("table",{staticStyle:{"text-align":"center"}},[e("tr",[e("th",{attrs:{colspan:"6"}},[s._v("device_1")])]),s._v(" "),e("tr",[e("th",{attrs:{colspan:"2"}},[s._v("sensor_1")]),e("th",{attrs:{colspan:"2"}},[s._v("sensor_2")]),e("th",{attrs:{colspan:"2"}},[s._v("sensor_3")])]),s._v(" "),e("tr",[e("th",[s._v("time")]),e("th",[s._v("value")]),e("th",[s._v("time")]),e("th",[s._v("value")]),e("th",[s._v("time")]),e("th",[s._v("value")])]),s._v(" "),e("tr",[e("td",[s._v("1")]),e("td",[s._v("1.2")]),e("td",[s._v("1")]),e("td",[s._v("20")]),e("td",[s._v("2")]),e("td",[s._v("50")])]),s._v(" "),e("tr",[e("td",[s._v("3")]),e("td",[s._v("1.4")]),e("td",[s._v("2")]),e("td",[s._v("20")]),e("td",[s._v("4")]),e("td",[s._v("51")])]),s._v(" "),e("tr",[e("td",[s._v("5")]),e("td",[s._v("1.1")]),e("td",[s._v("3")]),e("td",[s._v("21")]),e("td",[s._v("6")]),e("td",[s._v("52")])]),s._v(" "),e("tr",[e("td",[s._v("7")]),e("td",[s._v("1.8")]),e("td",[s._v("4")]),e("td",[s._v("20")]),e("td",[s._v("8")]),e("td",[s._v("53")])])]),s._v(" "),e("span",[s._v("一组时间序列数据")])]),s._v(" "),e("p",[e("strong",[s._v("单行数据")]),s._v(": 在许多工业应用程序中,一个设备通常包含多个传感器,这些传感器可能同时具有多个值,这称为一行数据。")]),s._v(" "),e("p",[s._v("在形式上,一行数据包含一个"),e("code",[s._v("device_id")]),s._v(",它是一个时间戳,表示从 1970年1月1日 00:00:00 开始的毫秒数,\n以及由"),e("code",[s._v("measurement_id")]),s._v("和相应的"),e("code",[s._v("value")]),s._v("组成的几个数据对。一行中的所有数据对都属于这个"),e("code",[s._v("device_id")]),s._v(",并且具有相同的时间戳。\n如果其中一个度量值"),e("code",[s._v("measurements")]),s._v("在某个时间戳"),e("code",[s._v("timestamp")]),s._v("没有值"),e("code",[s._v("value")]),s._v(",将使用一个空格表示(实际上 TsFile 并不存储 null 值)。\n其格式如下:")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("device_id, timestamp, <measurement_id, value>...\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("示例数据如下所示。在本例中,两个度量值(measurement)的数据类型分别是"),e("code",[s._v("INT32")]),s._v("和"),e("code",[s._v("FLOAT")]),s._v("。")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("device_1, 1490860659000, m1, 10, m2, 12.12\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("h3",{attrs:{id:"写入-tsfile"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#写入-tsfile"}},[s._v("#")]),s._v(" 写入 TsFile")]),s._v(" "),e("h4",{attrs:{id:"生成一个-tsfile-文件"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#生成一个-tsfile-文件"}},[s._v("#")]),s._v(" 生成一个 TsFile 文件")]),s._v(" "),e("p",[s._v('TsFile可以通过以下三个步骤生成,完整的代码参见"写入 TsFile 示例"章节。')]),s._v(" "),e("ul",[e("li",[e("p",[s._v("首先,构造一个"),e("code",[s._v("TsFileWriter")]),s._v("实例。")]),s._v(" "),e("p",[s._v("以下是可用的构造函数:")]),s._v(" "),e("ul",[e("li",[s._v("没有预定义 schema")])]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("public TsFileWriter(File file) throws IOException\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("ul",[e("li",[s._v("预定义 schema")])]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("public TsFileWriter(File file, Schema schema) throws IOException\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("这个是用于使用 HDFS 文件系统的。"),e("code",[s._v("TsFileOutput")]),s._v("可以是"),e("code",[s._v("HDFSOutput")]),s._v("类的一个实例。")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("public TsFileWriter(TsFileOutput output, Schema schema) throws IOException \n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("如果你想自己设置一些 TSFile 的配置,你可以使用"),e("code",[s._v("config")]),s._v("参数。比如:")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v('TSFileConfig conf = new TSFileConfig();\nconf.setTSFileStorageFs("HDFS");\nTsFileWriter tsFileWriter = new TsFileWriter(file, schema, conf);\n')])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br")])]),e("p",[s._v("在上面的例子中,数据文件将存储在 HDFS 中,而不是本地文件系统中。如果你想在本地文件系统中存储数据文件,你可以使用"),e("code",[s._v('conf.setTSFileStorageFs("LOCAL")')]),s._v(",这也是默认的配置。")]),s._v(" "),e("p",[s._v("您还可以通过"),e("code",[s._v("config.setHdfsIp(...)")]),s._v("和"),e("code",[s._v("config.setHdfsPort(...)")]),s._v("来配置 HDFS 的 IP 和端口。默认的 IP是"),e("code",[s._v("localhost")]),s._v(",默认的"),e("code",[s._v("RPC")]),s._v("端口是"),e("code",[s._v("9000")]),s._v(".")]),s._v(" "),e("p",[e("strong",[s._v("参数:")])]),s._v(" "),e("ul",[e("li",[e("p",[s._v("file : 写入 TsFile 数据的文件")])]),s._v(" "),e("li",[e("p",[s._v("schema : 文件的 schemas,将在下章进行介绍")])]),s._v(" "),e("li",[e("p",[s._v("config : TsFile 的一些配置项")])])])]),s._v(" "),e("li",[e("p",[s._v("第二步,添加测量值(measurement)")]),s._v(" "),e("p",[s._v("你也可以先创建一个"),e("code",[s._v("Schema")]),s._v("类的实例然后把它传递给"),e("code",[s._v("TsFileWriter")]),s._v("类的构造函数")]),s._v(" "),e("p",[e("code",[s._v("Schema")]),s._v("类保存的是一个映射关系,key 是一个 measurement 的名字,value 是 measurement schema.")]),s._v(" "),e("p",[s._v("下面是一系列接口:")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("// Create an empty Schema or from an existing map\npublic Schema()\npublic Schema(Map<String, MeasurementSchema> measurements)\n// Use this two interfaces to add measurements\npublic void registerMeasurement(MeasurementSchema descriptor)\npublic void registerMeasurements(Map<String, MeasurementSchema> measurements)\n// Some useful getter and checker\npublic TSDataType getMeasurementDataType(String measurementId)\npublic MeasurementSchema getMeasurementSchema(String measurementId)\npublic Map<String, MeasurementSchema> getAllMeasurementSchema()\npublic boolean hasMeasurement(String measurementId)\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br"),e("span",{staticClass:"line-number"},[s._v("9")]),e("br"),e("span",{staticClass:"line-number"},[s._v("10")]),e("br"),e("span",{staticClass:"line-number"},[s._v("11")]),e("br")])]),e("p",[s._v("你可以在"),e("code",[s._v("TsFileWriter")]),s._v("类中使用以下接口来添加额外的测量(measurement):\n​")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("public void addMeasurement(MeasurementSchema measurementSchema) throws WriteProcessException\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[e("code",[s._v("MeasurementSchema")]),s._v("类保存了一个测量(measurement)的信息,有几个构造函数:")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("public MeasurementSchema(String measurementId, TSDataType type, TSEncoding encoding)\npublic MeasurementSchema(String measurementId, TSDataType type, TSEncoding encoding, CompressionType compressionType)\npublic MeasurementSchema(String measurementId, TSDataType type, TSEncoding encoding, CompressionType compressionType, \nMap<String, String> props)\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br")])]),e("p",[e("strong",[s._v("参数:")]),s._v("\n​")]),s._v(" "),e("ul",[e("li",[e("p",[s._v("measurementID: 测量的名称,通常是传感器的名称。")])]),s._v(" "),e("li",[e("p",[s._v("type: 数据类型,现在支持六种类型: "),e("code",[s._v("BOOLEAN")]),s._v(", "),e("code",[s._v("INT32")]),s._v(", "),e("code",[s._v("INT64")]),s._v(", "),e("code",[s._v("FLOAT")]),s._v(", "),e("code",[s._v("DOUBLE")]),s._v(", "),e("code",[s._v("TEXT")]),s._v(";")])]),s._v(" "),e("li",[e("p",[s._v("encoding: 编码类型. 参见 "),e("RouterLink",{attrs:{to:"/zh/UserGuide/V0.11.x/Concept/Encoding.html"}},[s._v("Chapter 2-3")]),s._v(".")],1)]),s._v(" "),e("li",[e("p",[s._v("compression: 压缩方式. 现在支持 "),e("code",[s._v("UNCOMPRESSED")]),s._v(" 和 "),e("code",[s._v("SNAPPY")]),s._v(".")])]),s._v(" "),e("li",[e("p",[s._v("props: 特殊数据类型的属性。比如说"),e("code",[s._v("FLOAT")]),s._v("和"),e("code",[s._v("DOUBLE")]),s._v("可以设置"),e("code",[s._v("max_point_number")]),s._v(","),e("code",[s._v("TEXT")]),s._v("可以设置"),e("code",[s._v("max_string_length")]),s._v('。\n可以使用Map来保存键值对,比如("max_point_number", "3")。')])])]),s._v(" "),e("blockquote",[e("p",[e("strong",[s._v("注意:")]),s._v(" 虽然一个测量(measurement)的名字可以被用在多个deltaObjects中, 但是它的参数是不允许被修改的。比如:\n不允许多次为同一个测量(measurement)名添加不同类型的编码。下面是一个错误示例:")])]),s._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",[e("code",[s._v(' // The measurement "sensor_1" is float type\n addMeasurement(new MeasurementSchema("sensor_1", TSDataType.FLOAT, TSEncoding.RLE));\n \n // This call will throw a WriteProcessException exception\n addMeasurement(new MeasurementSchema("sensor_1", TSDataType.INT32, TSEncoding.RLE));\n')])])])]),s._v(" "),e("li",[e("p",[s._v("第三,插入和写入数据。")]),s._v(" "),e("p",[s._v("使用这个接口创建一个新的"),e("code",[s._v("TSRecord")]),s._v("(时间戳和设备对)。")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("public TSRecord(long timestamp, String deviceId)\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("然后创建一个"),e("code",[s._v("DataPoint")]),s._v("(度量(measurement)和值的对应),并使用 addTuple 方法将数据 DataPoint 添加正确的值到 TsRecord。")]),s._v(" "),e("p",[s._v("用下面这种方法写")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("public void write(TSRecord record) throws IOException, WriteProcessException\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])])]),s._v(" "),e("li",[e("p",[s._v("最后,调用"),e("code",[s._v("close")]),s._v("方法来完成写入过程。")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("public void close() throws IOException\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])])])]),s._v(" "),e("p",[s._v("我们也支持将数据写入已关闭的 TsFile 文件中。")]),s._v(" "),e("ul",[e("li",[s._v("使用"),e("code",[s._v("ForceAppendTsFileWriter")]),s._v("打开已经关闭的文件。")])]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("public ForceAppendTsFileWriter(File file) throws IOException\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("ul",[e("li",[e("p",[s._v("调用 "),e("code",[s._v("doTruncate")]),s._v(" 去掉文件的Metadata部分")])]),s._v(" "),e("li",[e("p",[s._v("然后使用 "),e("code",[s._v("ForceAppendTsFileWriter")]),s._v(" 构造另一个"),e("code",[s._v("TsFileWriter")])])])]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("public TsFileWriter(TsFileIOWriter fileWriter) throws IOException\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("请注意 此时需要重新添加测量值(measurement) 再进行上述写入操作。")]),s._v(" "),e("h4",{attrs:{id:"写入-tsfile-示例"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#写入-tsfile-示例"}},[s._v("#")]),s._v(" 写入 TsFile 示例")]),s._v(" "),e("p",[s._v("您需要安装 TsFile 到本地的 Maven 仓库中。")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("mvn clean install -pl tsfile -am -DskipTests\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("如果存在"),e("strong",[s._v("非对齐")]),s._v("的时序数据(比如:不是所有的传感器都有值),您可以通过构造"),e("strong",[s._v("TSRecord")]),s._v("来写入。")]),s._v(" "),e("p",[s._v("更详细的例子可以在"),e("code",[s._v("/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTSRecord.java")]),s._v("中查看")]),s._v(" "),e("p",[s._v("如果所有时序数据都是"),e("strong",[s._v("对齐")]),s._v("的,您可以通过构造"),e("strong",[s._v("Tablet")]),s._v("来写入数据。")]),s._v(" "),e("p",[s._v("更详细的例子可以在"),e("code",[s._v("/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTablet.java")]),s._v("中查看")]),s._v(" "),e("p",[s._v("在已关闭的TsFile 文件中写入新数据的详细例子可以在"),e("code",[s._v("/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileForceAppendWrite.java")]),s._v("中查看")]),s._v(" "),e("h3",{attrs:{id:"读取-tsfile-接口"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#读取-tsfile-接口"}},[s._v("#")]),s._v(" 读取 TsFile 接口")]),s._v(" "),e("h4",{attrs:{id:"开始之前"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#开始之前"}},[s._v("#")]),s._v(" 开始之前")]),s._v(" "),e("p",[s._v('"时序数据"章节中的数据集在本章节做具体的介绍。下表中显示的集合包含一个名为"device_1"的 deltaObject,包含了 3 个名为"sensor_1","sensor_2"和"sensor_3"的测量(measurement)。\n测量值被简化成一个简单的例子,每条数据只包含 4 条时间和值的对应数据。')]),s._v(" "),e("center",[e("table",{staticStyle:{"text-align":"center"}},[e("tr",[e("th",{attrs:{colspan:"6"}},[s._v("device_1")])]),s._v(" "),e("tr",[e("th",{attrs:{colspan:"2"}},[s._v("sensor_1")]),e("th",{attrs:{colspan:"2"}},[s._v("sensor_2")]),e("th",{attrs:{colspan:"2"}},[s._v("sensor_3")])]),s._v(" "),e("tr",[e("th",[s._v("time")]),e("th",[s._v("value")]),e("th",[s._v("time")]),e("th",[s._v("value")]),e("th",[s._v("time")]),e("th",[s._v("value")])]),s._v(" "),e("tr",[e("td",[s._v("1")]),e("td",[s._v("1.2")]),e("td",[s._v("1")]),e("td",[s._v("20")]),e("td",[s._v("2")]),e("td",[s._v("50")])]),s._v(" "),e("tr",[e("td",[s._v("3")]),e("td",[s._v("1.4")]),e("td",[s._v("2")]),e("td",[s._v("20")]),e("td",[s._v("4")]),e("td",[s._v("51")])]),s._v(" "),e("tr",[e("td",[s._v("5")]),e("td",[s._v("1.1")]),e("td",[s._v("3")]),e("td",[s._v("21")]),e("td",[s._v("6")]),e("td",[s._v("52")])]),s._v(" "),e("tr",[e("td",[s._v("7")]),e("td",[s._v("1.8")]),e("td",[s._v("4")]),e("td",[s._v("20")]),e("td",[s._v("8")]),e("td",[s._v("53")])])]),s._v(" "),e("span",[s._v("一组时间序列数据")])]),s._v(" "),e("h4",{attrs:{id:"路径的定义"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#路径的定义"}},[s._v("#")]),s._v(" 路径的定义")]),s._v(" "),e("p",[s._v('路径是一个点(.)分隔的字符串,它唯一地标识 TsFile 中的时间序列,例如:"root.area_1.device_1.sensor_1"。\n最后一部分"sensor_1"称为"measurementId",其余部分"root.area_1.device_1"称为deviceId。\n正如之前提到的,不同设备中的相同测量(measurement)具有相同的数据类型和编码,设备也是唯一的。')]),s._v(" "),e("p",[s._v("在read接口中,参数"),e("code",[s._v("paths")]),s._v("表示要选择的测量值(measurement)。\nPath实例可以很容易地通过类"),e("code",[s._v("Path")]),s._v("来构造。例如:")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v('Path p = new Path("device_1.sensor_1");\n')])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("我们可以为查询传递一个 ArrayList 路径,以支持多个路径查询。")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v('List<Path> paths = new ArrayList<Path>();\npaths.add(new Path("device_1.sensor_1"));\npaths.add(new Path("device_1.sensor_3"));\n')])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br")])]),e("blockquote",[e("p",[e("strong",[s._v("注意:")]),s._v(" 在构造路径时,参数的格式应该是一个点(.)分隔的字符串,最后一部分是measurement,其余部分确认为deviceId。")])]),s._v(" "),e("h4",{attrs:{id:"定义-filter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#定义-filter"}},[s._v("#")]),s._v(" 定义 Filter")]),s._v(" "),e("h5",{attrs:{id:"使用条件过滤"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#使用条件过滤"}},[s._v("#")]),s._v(" 使用条件过滤")]),s._v(" "),e("p",[s._v("在 TsFile 读取过程中使用 Filter 来选择满足一个或多个给定条件的数据。")]),s._v(" "),e("h4",{attrs:{id:"iexpression"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#iexpression"}},[s._v("#")]),s._v(" IExpression")]),s._v(" "),e("p",[e("code",[s._v("IExpression")]),s._v("是一个过滤器表达式接口,它将被传递给系统查询时调用。\n我们创建一个或多个筛选器表达式,并且可以使用"),e("code",[s._v("Binary Filter Operators")]),s._v("将它们连接形成最终表达式。")]),s._v(" "),e("ul",[e("li",[e("p",[e("strong",[s._v("创建一个Filter表达式")])]),s._v(" "),e("p",[s._v("有两种类型的过滤器。")]),s._v(" "),e("ul",[e("li",[e("p",[s._v("TimeFilter: 使用时序数据中的"),e("code",[s._v("time")]),s._v("过滤。")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("IExpression timeFilterExpr = new GlobalTimeExpression(TimeFilter);\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("使用以下关系获得一个"),e("code",[s._v("TimeFilter")]),s._v("对象(值是一个 long 型变量)。\n"),e("center",[e("table",{staticStyle:{"text-align":"center"}},[e("tr",[e("th",[s._v("Relationship")]),e("th",[s._v("Description")])]),s._v(" "),e("tr",[e("td",[s._v("TimeFilter.eq(value)")]),e("td",[s._v("选择时间等于值的数据")])]),s._v(" "),e("tr",[e("td",[s._v("TimeFilter.lt(value)")]),e("td",[s._v("选择时间小于值的数据")])]),s._v(" "),e("tr",[e("td",[s._v("TimeFilter.gt(value)")]),e("td",[s._v("选择时间大于值的数据")])]),s._v(" "),e("tr",[e("td",[s._v("TimeFilter.ltEq(value)")]),e("td",[s._v("选择时间小于等于值的数据")])]),s._v(" "),e("tr",[e("td",[s._v("TimeFilter.gtEq(value)")]),e("td",[s._v("选择时间大于等于值的数据")])]),s._v(" "),e("tr",[e("td",[s._v("TimeFilter.notEq(value)")]),e("td",[s._v("选择时间不等于值的数据")])]),s._v(" "),e("tr",[e("td",[s._v("TimeFilter.not(TimeFilter)")]),e("td",[s._v("选择时间不满足另一个时间过滤器的数据")])])])])],1)]),s._v(" "),e("li",[e("p",[s._v("ValueFilter: 使用时序数据中的"),e("code",[s._v("value")]),s._v("过滤。")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("IExpression valueFilterExpr = new SingleSeriesExpression(Path, ValueFilter);\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[e("code",[s._v("ValueFilter")]),s._v("的用法与"),e("code",[s._v("TimeFilter")]),s._v("相同,只是需要确保值的类型等于measurement(在路径中定义)的类型。")])])])]),s._v(" "),e("li",[e("p",[e("strong",[s._v("Binary Filter Operators")])]),s._v(" "),e("p",[s._v("Binary filter operators 可以用来连接两个单独的表达式。")]),s._v(" "),e("ul",[e("li",[s._v("BinaryExpression.and(Expression, Expression): 选择同时满足两个表达式的数据。")]),s._v(" "),e("li",[s._v("BinaryExpression.or(Expression, Expression): 选择满足任意一个表达式值的数据。")])])])]),s._v(" "),e("h5",{attrs:{id:"filter-expression-示例"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#filter-expression-示例"}},[s._v("#")]),s._v(" Filter Expression 示例")]),s._v(" "),e("ul",[e("li",[e("p",[e("strong",[s._v("TimeFilterExpression 示例")])]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("IExpression timeFilterExpr = new GlobalTimeExpression(TimeFilter.eq(15)); // series time = 15\n\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("IExpression timeFilterExpr = new GlobalTimeExpression(TimeFilter.ltEq(15)); // series time <= 15\n\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("IExpression timeFilterExpr = new GlobalTimeExpression(TimeFilter.lt(15)); // series time < 15\n\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("IExpression timeFilterExpr = new GlobalTimeExpression(TimeFilter.gtEq(15)); // series time >= 15\n\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("IExpression timeFilterExpr = new GlobalTimeExpression(TimeFilter.notEq(15)); // series time != 15\n\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("IExpression timeFilterExpr = BinaryExpression.and(new GlobalTimeExpression(TimeFilter.gtEq(15L)),\n new GlobalTimeExpression(TimeFilter.lt(25L))); // 15 <= series time < 25\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("IExpression timeFilterExpr = BinaryExpression.or(new GlobalTimeExpression(TimeFilter.gtEq(15L)),\n new GlobalTimeExpression(TimeFilter.lt(25L))); // series time >= 15 or series time < 25\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])])])]),s._v(" "),e("h4",{attrs:{id:"读取接口"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#读取接口"}},[s._v("#")]),s._v(" 读取接口")]),s._v(" "),e("p",[s._v("首先,我们打开 TsFile 并从文件路径"),e("code",[s._v("path")]),s._v("中获取一个"),e("code",[s._v("ReadOnlyTsFile")]),s._v("实例。")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("TsFileSequenceReader reader = new TsFileSequenceReader(path);\n \nReadOnlyTsFile readTsFile = new ReadOnlyTsFile(reader);\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br")])]),e("p",[s._v("接下来,我们准备路径数组和查询表达式,然后通过这个接口得到最终的"),e("code",[s._v("QueryExpression")]),s._v("对象:")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("QueryExpression queryExpression = QueryExpression.create(paths, statement);\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("ReadOnlyTsFile类有两个"),e("code",[s._v("query")]),s._v("方法来执行查询。")]),s._v(" "),e("ul",[e("li",[e("p",[e("strong",[s._v("Method 1")])]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("public QueryDataSet query(QueryExpression queryExpression) throws IOException\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])])]),s._v(" "),e("li",[e("p",[e("strong",[s._v("Method 2")])]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("public QueryDataSet query(QueryExpression queryExpression, long partitionStartOffset, long partitionEndOffset) throws IOException\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("此方法是为高级应用(如 TsFile-Spark 连接器)设计的。")]),s._v(" "),e("ul",[e("li",[e("strong",[s._v("参数")]),s._v(" : 对于 method 2,添加了两个额外的参数来支持部分查询(Partial Query):\n"),e("ul",[e("li",[e("code",[s._v("partitionStartOffset")]),s._v(": TsFile 的开始偏移量")]),s._v(" "),e("li",[e("code",[s._v("partitionEndOffset")]),s._v(": TsFile 的结束偏移量\n​")])]),s._v(" "),e("blockquote",[e("p",[e("strong",[s._v("什么是部分查询?")])]),s._v(" "),e("p",[s._v('在一些分布式文件系统中(比如:HDFS), 文件被分成几个部分,这些部分被称为"Blocks"并存储在不同的节点中。在涉及的每个节点上并行执行查询可以提高效率。因此需要部分查询(Partial Query)。部分查询(Partial Query)仅支持查询 TsFile 中被'),e("code",[s._v("QueryConstant.PARTITION_START_OFFSET")]),s._v("和"),e("code",[s._v("QueryConstant.PARTITION_END_OFFSET")]),s._v("分割的部分。")])])])])])]),s._v(" "),e("h3",{attrs:{id:"querydataset-接口"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#querydataset-接口"}},[s._v("#")]),s._v(" QueryDataset 接口")]),s._v(" "),e("p",[s._v("上面执行的查询将返回一个"),e("code",[s._v("QueryDataset")]),s._v("对象。")]),s._v(" "),e("p",[s._v("下面是一些用户常用的接口:")]),s._v(" "),e("ul",[e("li",[e("p",[e("code",[s._v("bool hasNext();")])]),s._v(" "),e("p",[s._v("如果该数据集仍然有数据,则返回true。")])]),s._v(" "),e("li",[e("p",[e("code",[s._v("List<Path> getPaths()")])]),s._v(" "),e("p",[s._v("获取这个数据集中的路径。")])]),s._v(" "),e("li",[e("p",[e("code",[s._v("List<TSDataType> getDataTypes();")])]),s._v(" "),e("p",[s._v("获取数据类型。TSDataType 是一个 enum 类,其值如下:")]),s._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",[e("code",[s._v(" BOOLEAN,\n INT32,\n INT64,\n FLOAT,\n DOUBLE,\n TEXT;\n")])])])]),s._v(" "),e("li",[e("p",[e("code",[s._v("RowRecord next() throws IOException;")])]),s._v(" "),e("p",[s._v("获取下一条记录。")]),s._v(" "),e("p",[e("code",[s._v("RowRecord")]),s._v("类包含一个"),e("code",[s._v("long")]),s._v("类型的时间戳和一个"),e("code",[s._v("List<Field>")]),s._v(",用于不同传感器中的数据,我们可以使用两个getter方法来获取它们。")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("long getTimestamp();\nList<Field> getFields();\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("p",[s._v("要从一个字段获取数据,请使用以下方法:")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("TSDataType getDataType();\nObject getObjectValue();\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])])])]),s._v(" "),e("h4",{attrs:{id:"读取现有-tsfile-示例"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#读取现有-tsfile-示例"}},[s._v("#")]),s._v(" 读取现有 TsFile 示例")]),s._v(" "),e("p",[s._v("您需要安装 TsFile 到本地的 Maven 仓库中。")]),s._v(" "),e("p",[s._v("有关查询语句的更详细示例,请参见\n"),e("code",[s._v("/tsfile/example/src/main/java/org/apache/iotdb/tsfile/TsFileRead.java")])]),s._v(" "),e("div",{staticClass:"language-java line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("package")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("apache"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("iotdb"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tsfile")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("io"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("IOException")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("util"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ArrayList")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("apache"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("iotdb"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tsfile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("read"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ReadOnlyTsFile")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("apache"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("iotdb"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tsfile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("read"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TsFileSequenceReader")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("apache"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("iotdb"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tsfile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("read"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("common"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Path")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("apache"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("iotdb"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tsfile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("read"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("expression"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("IExpression")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("apache"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("iotdb"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tsfile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("read"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("expression"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("QueryExpression")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("apache"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("iotdb"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tsfile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("read"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("expression"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("impl"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("BinaryExpression")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("apache"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("iotdb"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tsfile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("read"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("expression"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("impl"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("GlobalTimeExpression")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("apache"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("iotdb"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tsfile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("read"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("expression"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("impl"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SingleSeriesExpression")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("apache"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("iotdb"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tsfile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("read"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("filter"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TimeFilter")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("apache"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("iotdb"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tsfile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("read"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("filter"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ValueFilter")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("apache"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("iotdb"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tsfile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("read"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("query"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("dataset"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("QueryDataSet")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v('/**\n * The class is to show how to read TsFile file named "test.tsfile".\n * The TsFile file "test.tsfile" is generated from class TsFileWrite.\n * Run TsFileWrite to generate the test.tsfile first\n */')]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TsFileRead")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("queryAndPrint")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ArrayList")]),e("span",{pre:!0,attrs:{class:"token generics"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Path")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" paths"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ReadOnlyTsFile")]),s._v(" readTsFile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("IExpression")]),s._v(" statement"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("IOException")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("QueryExpression")]),s._v(" queryExpression "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("QueryExpression")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("create")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("paths"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" statement"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("QueryDataSet")]),s._v(" queryDataSet "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" readTsFile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("query")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("queryExpression"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("queryDataSet"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("hasNext")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("queryDataSet"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("next")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"------------"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" args"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("IOException")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// file path")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),s._v(" path "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"test.tsfile"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// create reader and get the readTsFile interface")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TsFileSequenceReader")]),s._v(" reader "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TsFileSequenceReader")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("path"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ReadOnlyTsFile")]),s._v(" readTsFile "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ReadOnlyTsFile")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reader"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// use these paths(all sensors) for all the queries")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ArrayList")]),e("span",{pre:!0,attrs:{class:"token generics"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Path")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" paths "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ArrayList")]),e("span",{pre:!0,attrs:{class:"token generics"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n paths"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Path")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"device_1.sensor_1"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n paths"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Path")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"device_1.sensor_2"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n paths"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Path")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"device_1.sensor_3"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// no query statement")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("queryAndPrint")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("paths"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" readTsFile"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("null")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//close the reader when you left")]),s._v("\n reader"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br"),e("span",{staticClass:"line-number"},[s._v("9")]),e("br"),e("span",{staticClass:"line-number"},[s._v("10")]),e("br"),e("span",{staticClass:"line-number"},[s._v("11")]),e("br"),e("span",{staticClass:"line-number"},[s._v("12")]),e("br"),e("span",{staticClass:"line-number"},[s._v("13")]),e("br"),e("span",{staticClass:"line-number"},[s._v("14")]),e("br"),e("span",{staticClass:"line-number"},[s._v("15")]),e("br"),e("span",{staticClass:"line-number"},[s._v("16")]),e("br"),e("span",{staticClass:"line-number"},[s._v("17")]),e("br"),e("span",{staticClass:"line-number"},[s._v("18")]),e("br"),e("span",{staticClass:"line-number"},[s._v("19")]),e("br"),e("span",{staticClass:"line-number"},[s._v("20")]),e("br"),e("span",{staticClass:"line-number"},[s._v("21")]),e("br"),e("span",{staticClass:"line-number"},[s._v("22")]),e("br"),e("span",{staticClass:"line-number"},[s._v("23")]),e("br"),e("span",{staticClass:"line-number"},[s._v("24")]),e("br"),e("span",{staticClass:"line-number"},[s._v("25")]),e("br"),e("span",{staticClass:"line-number"},[s._v("26")]),e("br"),e("span",{staticClass:"line-number"},[s._v("27")]),e("br"),e("span",{staticClass:"line-number"},[s._v("28")]),e("br"),e("span",{staticClass:"line-number"},[s._v("29")]),e("br"),e("span",{staticClass:"line-number"},[s._v("30")]),e("br"),e("span",{staticClass:"line-number"},[s._v("31")]),e("br"),e("span",{staticClass:"line-number"},[s._v("32")]),e("br"),e("span",{staticClass:"line-number"},[s._v("33")]),e("br"),e("span",{staticClass:"line-number"},[s._v("34")]),e("br"),e("span",{staticClass:"line-number"},[s._v("35")]),e("br"),e("span",{staticClass:"line-number"},[s._v("36")]),e("br"),e("span",{staticClass:"line-number"},[s._v("37")]),e("br"),e("span",{staticClass:"line-number"},[s._v("38")]),e("br"),e("span",{staticClass:"line-number"},[s._v("39")]),e("br"),e("span",{staticClass:"line-number"},[s._v("40")]),e("br"),e("span",{staticClass:"line-number"},[s._v("41")]),e("br"),e("span",{staticClass:"line-number"},[s._v("42")]),e("br"),e("span",{staticClass:"line-number"},[s._v("43")]),e("br"),e("span",{staticClass:"line-number"},[s._v("44")]),e("br"),e("span",{staticClass:"line-number"},[s._v("45")]),e("br"),e("span",{staticClass:"line-number"},[s._v("46")]),e("br"),e("span",{staticClass:"line-number"},[s._v("47")]),e("br"),e("span",{staticClass:"line-number"},[s._v("48")]),e("br"),e("span",{staticClass:"line-number"},[s._v("49")]),e("br"),e("span",{staticClass:"line-number"},[s._v("50")]),e("br"),e("span",{staticClass:"line-number"},[s._v("51")]),e("br"),e("span",{staticClass:"line-number"},[s._v("52")]),e("br"),e("span",{staticClass:"line-number"},[s._v("53")]),e("br")])]),e("h2",{attrs:{id:"修改-tsfile-配置项"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#修改-tsfile-配置项"}},[s._v("#")]),s._v(" 修改 TsFile 配置项")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("TSFileConfig config = TSFileDescriptor.getInstance().getConfig();\nconfig.setXXX();\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])])],1)}),[],!1,null,null,null);t.default=n.exports}}]);