blob: 5b1365b0fbd34845cf921c89e61245349440f0f9 [file] [log] [blame]
import{_ as p,C as c,O as o,P as l,ah as i,Q as s,U as n,ai as e,aW as t}from"./framework-e4340ccd.js";const u={},r=t(`<h2 id="tsfile-api" tabindex="-1"><a class="header-anchor" href="#tsfile-api" aria-hidden="true">#</a> TsFile API</h2><p>TsFile 是在 IoTDB 中使用的时间序列的文件格式。在这个章节中,我们将介绍这种文件格式的用法。</p><h3 id="安装-tsfile-library" tabindex="-1"><a class="header-anchor" href="#安装-tsfile-library" aria-hidden="true">#</a> 安装 TsFile library</h3><p>在您自己的项目中有两种方法使用 TsFile .</p><ul><li>使用 jar 包:编译源码生成 jar 包</li></ul><div class="language-bash line-numbers-mode" data-ext="sh"><pre class="language-bash"><code><span class="token function">git</span> clone https://github.com/apache/iotdb.git
<span class="token builtin class-name">cd</span> tsfile/
mvn clean package <span class="token parameter variable">-Dmaven.test.skip</span><span class="token operator">=</span>true
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>命令执行完成之后,所有的 jar 包都可以从 <code>target/</code> 目录下找到。之后您可以在自己的工程中导入 <code>target/tsfile-1.0.0.jar</code>.</p><ul><li>使用 Maven 依赖:</li></ul><p>编译源码并且部署到您的本地仓库中需要 3 步:</p><ol><li>下载源码</li></ol><div class="language-bash line-numbers-mode" data-ext="sh"><pre class="language-bash"><code><span class="token function">git</span> clone https://github.com/apache/iotdb.git
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><ol start="2"><li>编译源码和部署到本地仓库</li></ol><div class="language-bash line-numbers-mode" data-ext="sh"><pre class="language-bash"><code><span class="token builtin class-name">cd</span> tsfile/
mvn clean <span class="token function">install</span> <span class="token parameter variable">-Dmaven.test.skip</span><span class="token operator">=</span>true
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><ol start="3"><li>在您自己的工程中增加依赖:</li></ol><div class="language-xml line-numbers-mode" data-ext="xml"><pre class="language-xml"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>org.apache.iotdb<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>tsfile<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>version</span><span class="token punctuation">&gt;</span></span>0.12.0<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>version</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">&gt;</span></span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>或者,您可以直接使用官方的 Maven 仓库:</p><ol><li>首先,在<code>\${username}\\.m2\\settings.xml</code>目录下的<code>settings.xml</code>文件中<code>&lt;profiles&gt;</code> 节中增加<code>&lt;profile&gt;</code>,内容如下:</li></ol><div class="language-xml line-numbers-mode" data-ext="xml"><pre class="language-xml"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>profile</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>id</span><span class="token punctuation">&gt;</span></span>allow-snapshots<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>id</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>activation</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>activeByDefault</span><span class="token punctuation">&gt;</span></span>true<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>activeByDefault</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>activation</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>repositories</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>repository</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>id</span><span class="token punctuation">&gt;</span></span>apache.snapshots<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>id</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>name</span><span class="token punctuation">&gt;</span></span>Apache Development Snapshot Repository<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>name</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>url</span><span class="token punctuation">&gt;</span></span>https://repository.apache.org/content/repositories/snapshots/<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>url</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>releases</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>enabled</span><span class="token punctuation">&gt;</span></span>false<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>enabled</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>releases</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>snapshots</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>enabled</span><span class="token punctuation">&gt;</span></span>true<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>enabled</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>snapshots</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>repository</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>repositories</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>profile</span><span class="token punctuation">&gt;</span></span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="2"><li>之后您可以在您的工程中增加如下依赖:</li></ol><div class="language-xml line-numbers-mode" data-ext="xml"><pre class="language-xml"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>org.apache.iotdb<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>tsfile<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>version</span><span class="token punctuation">&gt;</span></span>1.0.0<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>version</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">&gt;</span></span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="tsfile-的使用" tabindex="-1"><a class="header-anchor" href="#tsfile-的使用" aria-hidden="true">#</a> TsFile 的使用</h3><p>本章节演示 TsFile 的详细用法。</p><p>时序数据 (Time-series Data) 一个时序是由 4 个序列组成,分别是 device, measurement, time, value。</p><ul><li><p><strong>measurement</strong>: 时间序列描述的是一个物理或者形式的测量 (measurement),比如:城市的温度,一些商品的销售数量或者是火车在不同时间的速度。 传统的传感器(如温度计)也采用单次测量 (measurement) 并产生时间序列,我们将在下面交替使用测量 (measurement) 和传感器。</p></li><li><p><strong>device</strong>: 一个设备指的是一个正在进行多次测量(产生多个时间序列)的实体,例如, ​ ​ ​ 一列正在运行的火车监控它的速度、油表、它已经运行的英里数,当前的乘客每个都被传送到一个时间序列。</p></li></ul><p><strong>单行数据</strong>: 在许多工业应用程序中,一个设备通常包含多个传感器,这些传感器可能同时具有多个值,这称为一行数据。</p><p>在形式上,一行数据包含一个<code>device_id</code>,它是一个时间戳,表示从 1970 年 1 月 1 日 00:00:00 开始的毫秒数, 以及由<code>measurement_id</code>和相应的<code>value</code>组成的几个数据对。一行中的所有数据对都属于这个<code>device_id</code>,并且具有相同的时间戳。 如果其中一个度量值<code>measurements</code>在某个时间戳<code>timestamp</code>没有值<code>value</code>,将使用一个空格表示(实际上 TsFile 并不存储 null 值)。 其格式如下:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>device_id, timestamp, &lt;measurement_id, value&gt;...
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>示例数据如下所示。在本例中,两个度量值 (measurement) 的数据类型分别是<code>INT32</code>和<code>FLOAT</code>。</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>device_1, 1490860659000, m1, 10, m2, 12.12
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><h4 id="写入-tsfile" tabindex="-1"><a class="header-anchor" href="#写入-tsfile" aria-hidden="true">#</a> 写入 TsFile</h4><p>TsFile 可以通过以下三个步骤生成,完整的代码参见&quot;写入 TsFile 示例&quot;章节。</p><ol><li><p>构造一个<code>TsFileWriter</code>实例。</p><p>以下是可用的构造函数:</p><ul><li>没有预定义 schema</li></ul><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token class-name">TsFileWriter</span><span class="token punctuation">(</span><span class="token class-name">File</span> file<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">IOException</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><ul><li>预定义 schema</li></ul><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token class-name">TsFileWriter</span><span class="token punctuation">(</span><span class="token class-name">File</span> file<span class="token punctuation">,</span> <span class="token class-name">Schema</span> schema<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">IOException</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>这个是用于使用 HDFS 文件系统的。<code>TsFileOutput</code>可以是<code>HDFSOutput</code>类的一个实例。</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token class-name">TsFileWriter</span><span class="token punctuation">(</span><span class="token class-name">TsFileOutput</span> output<span class="token punctuation">,</span> <span class="token class-name">Schema</span> schema<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">IOException</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>如果你想自己设置一些 TSFile 的配置,你可以使用<code>config</code>参数。比如:</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">TSFileConfig</span> conf <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TSFileConfig</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
conf<span class="token punctuation">.</span><span class="token function">setTSFileStorageFs</span><span class="token punctuation">(</span><span class="token string">&quot;HDFS&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">TsFileWriter</span> tsFileWriter <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TsFileWriter</span><span class="token punctuation">(</span>file<span class="token punctuation">,</span> schema<span class="token punctuation">,</span> conf<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在上面的例子中,数据文件将存储在 HDFS 中,而不是本地文件系统中。如果你想在本地文件系统中存储数据文件,你可以使用<code>conf.setTSFileStorageFs(&quot;LOCAL&quot;)</code>,这也是默认的配置。</p><p>您还可以通过<code>config.setHdfsIp(...)</code>和<code>config.setHdfsPort(...)</code>来配置 HDFS 的 IP 和端口。默认的 IP 是<code>localhost</code>,默认的<code>RPC</code>端口是<code>9000</code>.</p><p><strong>参数:</strong></p><ul><li>file : 写入 TsFile 数据的文件</li><li>schema : 文件的 schemas,将在下章进行介绍</li><li>config : TsFile 的一些配置项</li></ul></li><li><p>添加测量值 (measurement)</p><p>你也可以先创建一个<code>Schema</code>类的实例然后把它传递给<code>TsFileWriter</code>类的构造函数</p><p><code>Schema</code>类保存的是一个映射关系,key 是一个 measurement 的名字,value 是 measurement schema.</p><p>下面是一系列接口:</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token comment">// Create an empty Schema or from an existing map</span>
<span class="token keyword">public</span> <span class="token class-name">Schema</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">public</span> <span class="token class-name">Schema</span><span class="token punctuation">(</span><span class="token class-name">Map</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">MeasurementSchema</span><span class="token punctuation">&gt;</span></span> measurements<span class="token punctuation">)</span>
<span class="token comment">// Use this two interfaces to add measurements</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">registerMeasurement</span><span class="token punctuation">(</span><span class="token class-name">MeasurementSchema</span> descriptor<span class="token punctuation">)</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">registerMeasurements</span><span class="token punctuation">(</span><span class="token class-name">Map</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">MeasurementSchema</span><span class="token punctuation">&gt;</span></span> measurements<span class="token punctuation">)</span>
<span class="token comment">// Some useful getter and checker</span>
<span class="token keyword">public</span> <span class="token class-name">TSDataType</span> <span class="token function">getMeasurementDataType</span><span class="token punctuation">(</span><span class="token class-name">String</span> measurementId<span class="token punctuation">)</span>
<span class="token keyword">public</span> <span class="token class-name">MeasurementSchema</span> <span class="token function">getMeasurementSchema</span><span class="token punctuation">(</span><span class="token class-name">String</span> measurementId<span class="token punctuation">)</span>
<span class="token keyword">public</span> <span class="token class-name">Map</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">MeasurementSchema</span><span class="token punctuation">&gt;</span></span> <span class="token function">getAllMeasurementSchema</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">public</span> <span class="token keyword">boolean</span> <span class="token function">hasMeasurement</span><span class="token punctuation">(</span><span class="token class-name">String</span> measurementId<span class="token punctuation">)</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>你可以在<code>TsFileWriter</code>类中使用以下接口来添加额外的测量 (measurement): ​</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">addMeasurement</span><span class="token punctuation">(</span><span class="token class-name">MeasurementSchema</span> measurementSchema<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">WriteProcessException</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p><code>MeasurementSchema</code>类保存了一个测量 (measurement) 的信息,有几个构造函数:</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token class-name">MeasurementSchema</span><span class="token punctuation">(</span><span class="token class-name">String</span> measurementId<span class="token punctuation">,</span> <span class="token class-name">TSDataType</span> type<span class="token punctuation">,</span> <span class="token class-name">TSEncoding</span> encoding<span class="token punctuation">)</span>
<span class="token keyword">public</span> <span class="token class-name">MeasurementSchema</span><span class="token punctuation">(</span><span class="token class-name">String</span> measurementId<span class="token punctuation">,</span> <span class="token class-name">TSDataType</span> type<span class="token punctuation">,</span> <span class="token class-name">TSEncoding</span> encoding<span class="token punctuation">,</span> <span class="token class-name">CompressionType</span> compressionType<span class="token punctuation">)</span>
<span class="token keyword">public</span> <span class="token class-name">MeasurementSchema</span><span class="token punctuation">(</span><span class="token class-name">String</span> measurementId<span class="token punctuation">,</span> <span class="token class-name">TSDataType</span> type<span class="token punctuation">,</span> <span class="token class-name">TSEncoding</span> encoding<span class="token punctuation">,</span> <span class="token class-name">CompressionType</span> compressionType<span class="token punctuation">,</span>
<span class="token class-name">Map</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">&gt;</span></span> props<span class="token punctuation">)</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>参数:</strong> ​</p><ul><li><p>measurementID: 测量的名称,通常是传感器的名称。</p></li><li><p>type: 数据类型,现在支持六种类型:<code>BOOLEAN</code>, <code>INT32</code>, <code>INT64</code>, <code>FLOAT</code>, <code>DOUBLE</code>, <code>TEXT</code>;</p></li><li><p>encoding: 编码类型。</p></li><li><p>compression: 压缩方式。现在支持 <code>UNCOMPRESSED</code> 和 <code>SNAPPY</code>.</p></li><li><p>props: 特殊数据类型的属性。比如说<code>FLOAT</code>和<code>DOUBLE</code>可以设置<code>max_point_number</code>,<code>TEXT</code>可以设置<code>max_string_length</code>。 可以使用 Map 来保存键值对,比如 (&quot;max_point_number&quot;, &quot;3&quot;)。</p></li></ul><blockquote><p><strong>注意:</strong> 虽然一个测量 (measurement) 的名字可以被用在多个 deltaObjects 中,但是它的参数是不允许被修改的。比如: 不允许多次为同一个测量 (measurement) 名添加不同类型的编码。下面是一个错误示例:</p></blockquote><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token comment">// The measurement &quot;sensor_1&quot; is float type</span>
<span class="token function">addMeasurement</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">MeasurementSchema</span><span class="token punctuation">(</span><span class="token string">&quot;sensor_1&quot;</span><span class="token punctuation">,</span> <span class="token class-name">TSDataType</span><span class="token punctuation">.</span><span class="token constant">FLOAT</span><span class="token punctuation">,</span> <span class="token class-name">TSEncoding</span><span class="token punctuation">.</span><span class="token constant">RLE</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// This call will throw a WriteProcessException exception</span>
<span class="token function">addMeasurement</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">MeasurementSchema</span><span class="token punctuation">(</span><span class="token string">&quot;sensor_1&quot;</span><span class="token punctuation">,</span> <span class="token class-name">TSDataType</span><span class="token punctuation">.</span><span class="token constant">INT32</span><span class="token punctuation">,</span> <span class="token class-name">TSEncoding</span><span class="token punctuation">.</span><span class="token constant">RLE</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li><li><p>插入和写入数据。</p><p>使用这个接口创建一个新的<code>TSRecord</code>(时间戳和设备对)。</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token class-name">TSRecord</span><span class="token punctuation">(</span><span class="token keyword">long</span> timestamp<span class="token punctuation">,</span> <span class="token class-name">String</span> deviceId<span class="token punctuation">)</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>然后创建一个<code>DataPoint</code>(度量 (measurement) 和值的对应),并使用 addTuple 方法将数据 DataPoint 添加正确的值到 TsRecord。</p><p>用下面这种方法写</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">write</span><span class="token punctuation">(</span><span class="token class-name">TSRecord</span> record<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">IOException</span><span class="token punctuation">,</span> <span class="token class-name">WriteProcessException</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div></li><li><p>调用<code>close</code>方法来完成写入过程。</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">IOException</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div></li></ol><p>我们也支持将数据写入已关闭的 TsFile 文件中。</p><ol><li><p>使用<code>ForceAppendTsFileWriter</code>打开已经关闭的文件。</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token class-name">ForceAppendTsFileWriter</span><span class="token punctuation">(</span><span class="token class-name">File</span> file<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">IOException</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div></li><li><p>调用 <code>doTruncate</code> 去掉文件的 Metadata 部分</p></li><li><p>使用 <code>ForceAppendTsFileWriter</code> 构造另一个<code>TsFileWriter</code></p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token class-name">TsFileWriter</span><span class="token punctuation">(</span><span class="token class-name">TsFileIOWriter</span> fileWriter<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">IOException</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div></li></ol><p>请注意 此时需要重新添加测量值 (measurement) 再进行上述写入操作。</p><h4 id="写入-tsfile-示例" tabindex="-1"><a class="header-anchor" href="#写入-tsfile-示例" aria-hidden="true">#</a> 写入 TsFile 示例</h4><p>您需要安装 TsFile 到本地的 Maven 仓库中。</p><div class="language-bash line-numbers-mode" data-ext="sh"><pre class="language-bash"><code>mvn clean <span class="token function">install</span> <span class="token parameter variable">-pl</span> tsfile <span class="token parameter variable">-am</span> <span class="token parameter variable">-DskipTests</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>如果存在<strong>非对齐</strong>的时序数据(比如:不是所有的传感器都有值),您可以通过构造** TSRecord **来写入。</p><p>更详细的例子可以在</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTSRecord.java
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>中查看</p><p>如果所有时序数据都是<strong>对齐</strong>的,您可以通过构造** Tablet **来写入数据。</p><p>更详细的例子可以在</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTablet.java
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>中查看</p><p>在已关闭的 TsFile 文件中写入新数据的详细例子可以在</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileForceAppendWrite.java
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>中查看</p><h4 id="读取-tsfile-接口" tabindex="-1"><a class="header-anchor" href="#读取-tsfile-接口" aria-hidden="true">#</a> 读取 TsFile 接口</h4><ul><li>路径的定义</li></ul><p>路径是一个点 (.) 分隔的字符串,它唯一地标识 TsFile 中的时间序列,例如:&quot;root.area_1.device_1.sensor_1&quot;。 最后一部分&quot;sensor_1&quot;称为&quot;measurementId&quot;,其余部分&quot;root.area_1.device_1&quot;称为 deviceId 正如之前提到的,不同设备中的相同测量 (measurement) 具有相同的数据类型和编码,设备也是唯一的。</p><p>在 read 接口中,参数<code>paths</code>表示要选择的测量值 (measurement)。 Path 实例可以很容易地通过类<code>Path</code>来构造。例如:</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">Path</span> p <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Path</span><span class="token punctuation">(</span><span class="token string">&quot;device_1.sensor_1&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>我们可以为查询传递一个 ArrayList 路径,以支持多个路径查询。</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">List</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Path</span><span class="token punctuation">&gt;</span></span> paths <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ArrayList</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Path</span><span class="token punctuation">&gt;</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
paths<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Path</span><span class="token punctuation">(</span><span class="token string">&quot;device_1.sensor_1&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
paths<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Path</span><span class="token punctuation">(</span><span class="token string">&quot;device_1.sensor_3&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><blockquote><p><strong>注意:</strong> 在构造路径时,参数的格式应该是一个点 (.) 分隔的字符串,最后一部分是 measurement,其余部分确认为 deviceId。</p></blockquote><ul><li><p>定义 Filter</p><ul><li><p>使用条件过滤 在 TsFile 读取过程中使用 Filter 来选择满足一个或多个给定条件的数据。</p></li><li><p>IExpression <code>IExpression</code>是一个过滤器表达式接口,它将被传递给系统查询时调用。 我们创建一个或多个筛选器表达式,并且可以使用<code>Binary Filter Operators</code>将它们连接形成最终表达式。</p></li></ul></li><li><p><strong>创建一个 Filter 表达式</strong></p><p>有两种类型的过滤器。</p><ul><li>TimeFilter: 使用时序数据中的<code>time</code>过滤。</li></ul><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">IExpression</span> timeFilterExpr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlobalTimeExpression</span><span class="token punctuation">(</span><span class="token class-name">TimeFilter</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div></li></ul><p>使用以下关系获得一个<code>TimeFilter</code>对象(值是一个 long 型变量)。</p>`,59),d=s("thead",null,[s("tr",null,[s("th",null,"Relationship"),s("th",null,"Description")])],-1),k=s("tr",null,[s("td",null,"TimeFilter.eq(value)"),s("td",null,"选择时间等于值的数据")],-1),m={href:"http://TimeFilter.lt",target:"_blank",rel:"noopener noreferrer"},v=s("td",null,"选择时间小于值的数据",-1),g={href:"http://TimeFilter.gt",target:"_blank",rel:"noopener noreferrer"},b=s("td",null,"选择时间大于值的数据",-1),h=s("tr",null,[s("td",null,"TimeFilter.ltEq(value)"),s("td",null,"选择时间小于等于值的数据")],-1),y=s("tr",null,[s("td",null,"TimeFilter.gtEq(value)"),s("td",null,"选择时间大于等于值的数据")],-1),f=s("tr",null,[s("td",null,"TimeFilter.notEq(value)"),s("td",null,"选择时间不等于值的数据")],-1),T=s("tr",null,[s("td",null,"TimeFilter.not(TimeFilter)"),s("td",null,"选择时间不满足另一个时间过滤器的数据")],-1),x=t(`<ul><li>ValueFilter: 使用时序数据中的<code>value</code>过滤。</li></ul><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">IExpression</span> valueFilterExpr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SingleSeriesExpression</span><span class="token punctuation">(</span><span class="token class-name">Path</span><span class="token punctuation">,</span> <span class="token class-name">ValueFilter</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p><code>ValueFilter</code>的用法与<code>TimeFilter</code>相同,只是需要确保值的类型等于 measurement(在路径中定义)的类型。</p><ul><li><p><strong>Binary Filter Operators</strong></p><p>Binary filter operators 可以用来连接两个单独的表达式。</p><ul><li>BinaryExpression.and(Expression, Expression): 选择同时满足两个表达式的数据。</li><li>BinaryExpression.or(Expression, Expression): 选择满足任意一个表达式值的数据。</li></ul></li></ul><p>Filter Expression 示例</p><ul><li><strong>TimeFilterExpression 示例</strong></li></ul><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">IExpression</span> timeFilterExpr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlobalTimeExpression</span><span class="token punctuation">(</span><span class="token class-name">TimeFilter</span><span class="token punctuation">.</span><span class="token function">eq</span><span class="token punctuation">(</span><span class="token number">15</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// series time = 15</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">IExpression</span> timeFilterExpr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlobalTimeExpression</span><span class="token punctuation">(</span><span class="token class-name">TimeFilter</span><span class="token punctuation">.</span><span class="token function">ltEq</span><span class="token punctuation">(</span><span class="token number">15</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// series time &lt;= 15</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">IExpression</span> timeFilterExpr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlobalTimeExpression</span><span class="token punctuation">(</span><span class="token class-name">TimeFilter</span><span class="token punctuation">.</span><span class="token function">lt</span><span class="token punctuation">(</span><span class="token number">15</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// series time &lt; 15</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">IExpression</span> timeFilterExpr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlobalTimeExpression</span><span class="token punctuation">(</span><span class="token class-name">TimeFilter</span><span class="token punctuation">.</span><span class="token function">gtEq</span><span class="token punctuation">(</span><span class="token number">15</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// series time &gt;= 15</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">IExpression</span> timeFilterExpr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlobalTimeExpression</span><span class="token punctuation">(</span><span class="token class-name">TimeFilter</span><span class="token punctuation">.</span><span class="token function">notEq</span><span class="token punctuation">(</span><span class="token number">15</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// series time != 15</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">IExpression</span> timeFilterExpr <span class="token operator">=</span> <span class="token class-name">BinaryExpression</span><span class="token punctuation">.</span><span class="token function">and</span><span class="token punctuation">(</span>
<span class="token keyword">new</span> <span class="token class-name">GlobalTimeExpression</span><span class="token punctuation">(</span><span class="token class-name">TimeFilter</span><span class="token punctuation">.</span><span class="token function">gtEq</span><span class="token punctuation">(</span><span class="token number">15L</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token keyword">new</span> <span class="token class-name">GlobalTimeExpression</span><span class="token punctuation">(</span><span class="token class-name">TimeFilter</span><span class="token punctuation">.</span><span class="token function">lt</span><span class="token punctuation">(</span><span class="token number">25L</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 15 &lt;= series time &lt; 25</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">IExpression</span> timeFilterExpr <span class="token operator">=</span> <span class="token class-name">BinaryExpression</span><span class="token punctuation">.</span><span class="token function">or</span><span class="token punctuation">(</span>
<span class="token keyword">new</span> <span class="token class-name">GlobalTimeExpression</span><span class="token punctuation">(</span><span class="token class-name">TimeFilter</span><span class="token punctuation">.</span><span class="token function">gtEq</span><span class="token punctuation">(</span><span class="token number">15L</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token keyword">new</span> <span class="token class-name">GlobalTimeExpression</span><span class="token punctuation">(</span><span class="token class-name">TimeFilter</span><span class="token punctuation">.</span><span class="token function">lt</span><span class="token punctuation">(</span><span class="token number">25L</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// series time &gt;= 15 or series time &lt; 25</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul><li>读取接口</li></ul><p>首先,我们打开 TsFile 并从文件路径<code>path</code>中获取一个<code>ReadOnlyTsFile</code>实例。</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">TsFileSequenceReader</span> reader <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TsFileSequenceReader</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">ReadOnlyTsFile</span> readTsFile <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ReadOnlyTsFile</span><span class="token punctuation">(</span>reader<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><p>接下来,我们准备路径数组和查询表达式,然后通过这个接口得到最终的<code>QueryExpression</code>对象:</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">QueryExpression</span> queryExpression <span class="token operator">=</span> <span class="token class-name">QueryExpression</span><span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span>paths<span class="token punctuation">,</span> statement<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>ReadOnlyTsFile 类有两个<code>query</code>方法来执行查询。</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token class-name">QueryDataSet</span> <span class="token function">query</span><span class="token punctuation">(</span><span class="token class-name">QueryExpression</span> queryExpression<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">IOException</span>
<span class="token keyword">public</span> <span class="token class-name">QueryDataSet</span> <span class="token function">query</span><span class="token punctuation">(</span><span class="token class-name">QueryExpression</span> queryExpression<span class="token punctuation">,</span> <span class="token keyword">long</span> partitionStartOffset<span class="token punctuation">,</span> <span class="token keyword">long</span> partitionEndOffset<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">IOException</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><p>此方法是为高级应用(如 TsFile-Spark 连接器)设计的。</p><ul><li><strong>参数</strong> : 对于第二个方法,添加了两个额外的参数来支持部分查询 (Partial Query): <ul><li><code>partitionStartOffset</code>: TsFile 的开始偏移量</li><li><code>partitionEndOffset</code>: TsFile 的结束偏移量</li></ul></li></ul><blockquote><p>什么是部分查询?</p></blockquote><blockquote><p>在一些分布式文件系统中(比如:HDFS), 文件被分成几个部分,这些部分被称为&quot;Blocks&quot;并存储在不同的节点中。在涉及的每个节点上并行执行查询可以提高效率。因此需要部分查询 (Partial Query)。部分查询 (Partial Query) 仅支持查询 TsFile 中被<code>QueryConstant.PARTITION_START_OFFSET</code>和<code>QueryConstant.PARTITION_END_OFFSET</code>分割的部分。</p></blockquote><ul><li>QueryDataset 接口</li></ul><p>上面执行的查询将返回一个<code>QueryDataset</code>对象。</p><p>以下是一些用户常用的接口:</p><ul><li><p><code>bool hasNext();</code></p><p>如果该数据集仍然有数据,则返回 true。</p></li><li><p><code>List&lt;Path&gt; getPaths()</code></p><p>获取这个数据集中的路径。</p></li><li><p><code>List&lt;TSDataType&gt; getDataTypes();</code></p><p>获取数据类型。</p></li><li><p><code>RowRecord next() throws IOException;</code></p><p>获取下一条记录。</p><p><code>RowRecord</code>类包含一个<code>long</code>类型的时间戳和一个<code>List&lt;Field&gt;</code>,用于不同传感器中的数据,我们可以使用两个 getter 方法来获取它们。</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">long</span> <span class="token function">getTimestamp</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">List</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Field</span><span class="token punctuation">&gt;</span></span> <span class="token function">getFields</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><p>要从一个字段获取数据,请使用以下方法:</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">TSDataType</span> <span class="token function">getDataType</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Object</span> <span class="token function">getObjectValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div></li></ul><h4 id="读取现有-tsfile-示例" tabindex="-1"><a class="header-anchor" href="#读取现有-tsfile-示例" aria-hidden="true">#</a> 读取现有 TsFile 示例</h4><p>您需要安装 TsFile 到本地的 Maven 仓库中。</p><p>有关查询语句的更详细示例,请参见 <code>/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileRead.java</code></p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">package</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>tsfile</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">IOException</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">ArrayList</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>tsfile<span class="token punctuation">.</span>read<span class="token punctuation">.</span></span><span class="token class-name">ReadOnlyTsFile</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>tsfile<span class="token punctuation">.</span>read<span class="token punctuation">.</span></span><span class="token class-name">TsFileSequenceReader</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>tsfile<span class="token punctuation">.</span>read<span class="token punctuation">.</span>common<span class="token punctuation">.</span></span><span class="token class-name">Path</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>tsfile<span class="token punctuation">.</span>read<span class="token punctuation">.</span>expression<span class="token punctuation">.</span></span><span class="token class-name">IExpression</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>tsfile<span class="token punctuation">.</span>read<span class="token punctuation">.</span>expression<span class="token punctuation">.</span></span><span class="token class-name">QueryExpression</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>tsfile<span class="token punctuation">.</span>read<span class="token punctuation">.</span>expression<span class="token punctuation">.</span>impl<span class="token punctuation">.</span></span><span class="token class-name">BinaryExpression</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>tsfile<span class="token punctuation">.</span>read<span class="token punctuation">.</span>expression<span class="token punctuation">.</span>impl<span class="token punctuation">.</span></span><span class="token class-name">GlobalTimeExpression</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>tsfile<span class="token punctuation">.</span>read<span class="token punctuation">.</span>expression<span class="token punctuation">.</span>impl<span class="token punctuation">.</span></span><span class="token class-name">SingleSeriesExpression</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>tsfile<span class="token punctuation">.</span>read<span class="token punctuation">.</span>filter<span class="token punctuation">.</span></span><span class="token class-name">TimeFilter</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>tsfile<span class="token punctuation">.</span>read<span class="token punctuation">.</span>filter<span class="token punctuation">.</span></span><span class="token class-name">ValueFilter</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>tsfile<span class="token punctuation">.</span>read<span class="token punctuation">.</span>query<span class="token punctuation">.</span>dataset<span class="token punctuation">.</span></span><span class="token class-name">QueryDataSet</span></span><span class="token punctuation">;</span>
<span class="token doc-comment comment">/**
* The class is to show how to read TsFile file named &quot;test.tsfile&quot;.
* The TsFile file &quot;test.tsfile&quot; is generated from class TsFileWrite.
* Run TsFileWrite to generate the test.tsfile first
*/</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">TsFileRead</span> <span class="token punctuation">{</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token class-name">String</span> <span class="token constant">DEVICE1</span> <span class="token operator">=</span> <span class="token string">&quot;device_1&quot;</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">queryAndPrint</span><span class="token punctuation">(</span><span class="token class-name">ArrayList</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Path</span><span class="token punctuation">&gt;</span></span> paths<span class="token punctuation">,</span> <span class="token class-name">ReadOnlyTsFile</span> readTsFile<span class="token punctuation">,</span> <span class="token class-name">IExpression</span> statement<span class="token punctuation">)</span>
<span class="token keyword">throws</span> <span class="token class-name">IOException</span> <span class="token punctuation">{</span>
<span class="token class-name">QueryExpression</span> queryExpression <span class="token operator">=</span> <span class="token class-name">QueryExpression</span><span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span>paths<span class="token punctuation">,</span> statement<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">QueryDataSet</span> queryDataSet <span class="token operator">=</span> readTsFile<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span>queryExpression<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span>queryDataSet<span class="token punctuation">.</span><span class="token function">hasNext</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>queryDataSet<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">&quot;------------&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">IOException</span> <span class="token punctuation">{</span>
<span class="token comment">// file path</span>
<span class="token class-name">String</span> path <span class="token operator">=</span> <span class="token string">&quot;test.tsfile&quot;</span><span class="token punctuation">;</span>
<span class="token comment">// create reader and get the readTsFile interface</span>
<span class="token keyword">try</span> <span class="token punctuation">(</span><span class="token class-name">TsFileSequenceReader</span> reader <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TsFileSequenceReader</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">ReadOnlyTsFile</span> readTsFile <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ReadOnlyTsFile</span><span class="token punctuation">(</span>reader<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token comment">// use these paths(all sensors) for all the queries</span>
<span class="token class-name">ArrayList</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Path</span><span class="token punctuation">&gt;</span></span> paths <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ArrayList</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token punctuation">&gt;</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
paths<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Path</span><span class="token punctuation">(</span><span class="token constant">DEVICE1</span><span class="token punctuation">,</span> <span class="token string">&quot;sensor_1&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
paths<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Path</span><span class="token punctuation">(</span><span class="token constant">DEVICE1</span><span class="token punctuation">,</span> <span class="token string">&quot;sensor_2&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
paths<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Path</span><span class="token punctuation">(</span><span class="token constant">DEVICE1</span><span class="token punctuation">,</span> <span class="token string">&quot;sensor_3&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// no filter, should select 1 2 3 4 6 7 8</span>
<span class="token function">queryAndPrint</span><span class="token punctuation">(</span>paths<span class="token punctuation">,</span> readTsFile<span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// time filter : 4 &lt;= time &lt;= 10, should select 4 6 7 8</span>
<span class="token class-name">IExpression</span> timeFilter <span class="token operator">=</span>
<span class="token class-name">BinaryExpression</span><span class="token punctuation">.</span><span class="token function">and</span><span class="token punctuation">(</span>
<span class="token keyword">new</span> <span class="token class-name">GlobalTimeExpression</span><span class="token punctuation">(</span><span class="token class-name">TimeFilter</span><span class="token punctuation">.</span><span class="token function">gtEq</span><span class="token punctuation">(</span><span class="token number">4L</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token keyword">new</span> <span class="token class-name">GlobalTimeExpression</span><span class="token punctuation">(</span><span class="token class-name">TimeFilter</span><span class="token punctuation">.</span><span class="token function">ltEq</span><span class="token punctuation">(</span><span class="token number">10L</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">queryAndPrint</span><span class="token punctuation">(</span>paths<span class="token punctuation">,</span> readTsFile<span class="token punctuation">,</span> timeFilter<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// value filter : device_1.sensor_2 &lt;= 20, should select 1 2 4 6 7</span>
<span class="token class-name">IExpression</span> valueFilter <span class="token operator">=</span>
<span class="token keyword">new</span> <span class="token class-name">SingleSeriesExpression</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Path</span><span class="token punctuation">(</span><span class="token constant">DEVICE1</span><span class="token punctuation">,</span> <span class="token string">&quot;sensor_2&quot;</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">ValueFilter</span><span class="token punctuation">.</span><span class="token function">ltEq</span><span class="token punctuation">(</span><span class="token number">20L</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">queryAndPrint</span><span class="token punctuation">(</span>paths<span class="token punctuation">,</span> readTsFile<span class="token punctuation">,</span> valueFilter<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// time filter : 4 &lt;= time &lt;= 10, value filter : device_1.sensor_3 &gt;= 20, should select 4 7 8</span>
timeFilter <span class="token operator">=</span>
<span class="token class-name">BinaryExpression</span><span class="token punctuation">.</span><span class="token function">and</span><span class="token punctuation">(</span>
<span class="token keyword">new</span> <span class="token class-name">GlobalTimeExpression</span><span class="token punctuation">(</span><span class="token class-name">TimeFilter</span><span class="token punctuation">.</span><span class="token function">gtEq</span><span class="token punctuation">(</span><span class="token number">4L</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token keyword">new</span> <span class="token class-name">GlobalTimeExpression</span><span class="token punctuation">(</span><span class="token class-name">TimeFilter</span><span class="token punctuation">.</span><span class="token function">ltEq</span><span class="token punctuation">(</span><span class="token number">10L</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
valueFilter <span class="token operator">=</span>
<span class="token keyword">new</span> <span class="token class-name">SingleSeriesExpression</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Path</span><span class="token punctuation">(</span><span class="token constant">DEVICE1</span><span class="token punctuation">,</span> <span class="token string">&quot;sensor_3&quot;</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">ValueFilter</span><span class="token punctuation">.</span><span class="token function">gtEq</span><span class="token punctuation">(</span><span class="token number">20L</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">IExpression</span> finalFilter <span class="token operator">=</span> <span class="token class-name">BinaryExpression</span><span class="token punctuation">.</span><span class="token function">and</span><span class="token punctuation">(</span>timeFilter<span class="token punctuation">,</span> valueFilter<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">queryAndPrint</span><span class="token punctuation">(</span>paths<span class="token punctuation">,</span> readTsFile<span class="token punctuation">,</span> finalFilter<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="修改-tsfile-配置项" tabindex="-1"><a class="header-anchor" href="#修改-tsfile-配置项" aria-hidden="true">#</a> 修改 TsFile 配置项</h3><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">TSFileConfig</span> config <span class="token operator">=</span> <span class="token class-name">TSFileDescriptor</span><span class="token punctuation">.</span><span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getConfig</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
config<span class="token punctuation">.</span><span class="token function">setXXX</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div>`,34);function w(F,E){const a=c("ExternalLinkIcon");return o(),l("div",null,[i(`
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
`),r,s("table",null,[d,s("tbody",null,[k,s("tr",null,[s("td",null,[s("a",m,[n("TimeFilter.lt"),e(a)]),n("(value)")]),v]),s("tr",null,[s("td",null,[s("a",g,[n("TimeFilter.gt"),e(a)]),n("(value)")]),b]),h,y,f,T])]),x])}const j=p(u,[["render",w],["__file","Programming-TsFile-API.html.vue"]]);export{j as default};