| import{_ as n,c as a,b as e,o as t}from"./app-W3EENNaa.js";const p={};function l(i,s){return t(),a("div",null,s[0]||(s[0]=[e(`<h2 id="tsfile-api" tabindex="-1"><a class="header-anchor" href="#tsfile-api"><span>TsFile API</span></a></h2><p>TsFile is a file format of Time Series used in IoTDB. This session introduces the usage of this file format.</p><h3 id="tsfile-library-installation" tabindex="-1"><a class="header-anchor" href="#tsfile-library-installation"><span>TsFile library Installation</span></a></h3><p>There are two ways to use TsFile in your own project.</p><ul><li>Use as jars: Compile the source codes and build to jars</li></ul><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre><code><span class="line"><span class="token function">git</span> clone https://github.com/apache/iotdb.git</span> |
| <span class="line"><span class="token builtin class-name">cd</span> tsfile/</span> |
| <span class="line">mvn clean package <span class="token parameter variable">-Dmaven.test.skip</span><span class="token operator">=</span>true</span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Then, all the jars are in folder named <code>target/</code>. Import <code>target/tsfile-0.12.0-jar-with-dependencies.jar</code> to your project.</p><ul><li><p>Use as a maven dependency:</p><p>Compile source codes and deploy to your local repository in three steps:</p><ul><li><p>Get the source codes</p><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre><code><span class="line"><span class="token function">git</span> clone https://github.com/apache/iotdb.git</span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div></li><li><p>Compile the source codes and deploy</p><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre><code><span class="line"><span class="token builtin class-name">cd</span> tsfile/</span> |
| <span class="line">mvn clean <span class="token function">install</span> <span class="token parameter variable">-Dmaven.test.skip</span><span class="token operator">=</span>true</span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div></li><li><p>add dependencies into your project:</p><div class="language-xml line-numbers-mode" data-highlighter="prismjs" data-ext="xml" data-title="xml"><pre><code><span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>org.apache.iotdb<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>tsfile<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>1.0.0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span></span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><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></li></ul><p>Or, you can download the dependencies from official Maven repository:</p><ul><li><p>First, find your maven <code>settings.xml</code> on path: <code>\${username}\\.m2\\settings.xml</code><br> , add this <code><profile></code> to <code><profiles></code>:</p><div class="language-xml line-numbers-mode" data-highlighter="prismjs" data-ext="xml" data-title="xml"><pre><code><span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>profile</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>id</span><span class="token punctuation">></span></span>allow-snapshots<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>id</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>activation</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>activeByDefault</span><span class="token punctuation">></span></span>true<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>activeByDefault</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>activation</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>repositories</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>repository</span><span class="token punctuation">></span></span> </span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>id</span><span class="token punctuation">></span></span>apache.snapshots<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>id</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>name</span><span class="token punctuation">></span></span>Apache Development Snapshot Repository<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>name</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>url</span><span class="token punctuation">></span></span>https://repository.apache.org/content/repositories/snapshots/<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>url</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>releases</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>enabled</span><span class="token punctuation">></span></span>false<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>enabled</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>releases</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>snapshots</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>enabled</span><span class="token punctuation">></span></span>true<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>enabled</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>snapshots</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>repository</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>repositories</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>profile</span><span class="token punctuation">></span></span></span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><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></li><li><p>Then add dependencies into your project:</p><div class="language-xml line-numbers-mode" data-highlighter="prismjs" data-ext="xml" data-title="xml"><pre><code><span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>org.apache.iotdb<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>tsfile<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>1.0.0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span></span> |
| <span class="line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span></span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><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></li></ul></li></ul><h3 id="tsfile-usage" tabindex="-1"><a class="header-anchor" href="#tsfile-usage"><span>TsFile Usage</span></a></h3><p>This section demonstrates the detailed usages of TsFile.</p><p>Time-series Data<br> Time-series data is considered as a sequence of quadruples. A quadruple is defined as (device, measurement, time, value).</p><ul><li><p><strong>measurement</strong>: A physical or formal measurement that a time-series data takes, e.g., the temperature of a city, the<br> sales number of some goods or the speed of a train at different times. As a traditional sensor (like a thermometer) also<br> takes a single measurement and produce a time-series, we will use measurement and sensor interchangeably below.</p></li><li><p><strong>device</strong>: A device refers to an entity that takes several measurements (producing multiple time-series), e.g.,<br> a running train monitors its speed, oil meter, miles it has run, current passengers each is conveyed to a time-series dataset.</p></li></ul><p><strong>One Line of Data</strong>: In many industrial applications, a device normally contains more than one sensor and these sensors<br> may have values at the same timestamp, which is called one line of data.</p><p>Formally, one line of data consists of a <code>device_id</code>, a timestamp which indicates the milliseconds since January 1,<br> 1970, 00:00:00, and several data pairs composed of <code>measurement_id</code> and corresponding <code>value</code>. All data pairs in one<br> line belong to this <code>device_id</code> and have the same timestamp. If one of the <code>measurements</code> does not have a <code>value</code><br> in the <code>timestamp</code>, use a space instead(Actually, TsFile does not store null values). Its format is shown as follow:</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">device_id, timestamp, <measurement_id, value>...</span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>An example is illustrated as follow. In this example, the data type of two measurements are <code>INT32</code>, <code>FLOAT</code> respectively.</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">device_1, 1490860659000, m1, 10, m2, 12.12</span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><h4 id="write-tsfile" tabindex="-1"><a class="header-anchor" href="#write-tsfile"><span>Write TsFile</span></a></h4><p>A TsFile is generated by the following three steps and the complete code is given in the section "Example for writing TsFile".</p><ol><li><p>construct a <code>TsFileWriter</code> instance.</p><p>Here are the available constructors:</p><ul><li>Without pre-defined schema</li></ul><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><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></span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><ul><li>With pre-defined schema</li></ul><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><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></span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>This one is for using the HDFS file system. <code>TsFileOutput</code> can be an instance of class <code>HDFSOutput</code>.</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><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> </span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>If you want to set some TSFile configuration on your own, you could use param <code>config</code>. For example:</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><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></span> |
| <span class="line">conf<span class="token punctuation">.</span><span class="token function">setTSFileStorageFs</span><span class="token punctuation">(</span><span class="token string">"HDFS"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span> |
| <span class="line"><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></span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>In this example, data files will be stored in HDFS, instead of local file system. If you'd like to store data files in local file system, you can use <code>conf.setTSFileStorageFs("LOCAL")</code>, which is also the default config.</p><p>You can also config the ip and rpc port of your HDFS by <code>config.setHdfsIp(...)</code> and <code>config.setHdfsPort(...)</code>. The default ip is <code>localhost</code> and default rpc port is <code>9000</code>.</p><p><strong>Parameters:</strong></p><ul><li><p>file : The TsFile to write</p></li><li><p>schema : The file schemas, will be introduced in next part.</p></li><li><p>config : The config of TsFile.</p></li></ul></li><li><p>add measurements</p><p>Or you can make an instance of class <code>Schema</code> first and pass this to the constructor of class <code>TsFileWriter</code></p><p>The class <code>Schema</code> contains a map whose key is the name of one measurement schema, and the value is the schema itself.</p><p>Here are the interfaces:</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><span class="token comment">// Create an empty Schema or from an existing map</span></span> |
| <span class="line"><span class="token keyword">public</span> <span class="token class-name">Schema</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span> |
| <span class="line"><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"><</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">MeasurementSchema</span><span class="token punctuation">></span></span> measurements<span class="token punctuation">)</span></span> |
| <span class="line"><span class="token comment">// Use this two interfaces to add measurements</span></span> |
| <span class="line"><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> |
| <span class="line"><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"><</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">MeasurementSchema</span><span class="token punctuation">></span></span> measurements<span class="token punctuation">)</span></span> |
| <span class="line"><span class="token comment">// Some useful getter and checker</span></span> |
| <span class="line"><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> |
| <span class="line"><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> |
| <span class="line"><span class="token keyword">public</span> <span class="token class-name">Map</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">MeasurementSchema</span><span class="token punctuation">></span></span> <span class="token function">getAllMeasurementSchema</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span> |
| <span class="line"><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></span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><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>You can always use the following interface in <code>TsFileWriter</code> class to add additional measurements:</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><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></span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>The class <code>MeasurementSchema</code> contains the information of one measurement, there are several constructors:</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><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> |
| <span class="line"><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> |
| <span class="line"><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> |
| <span class="line"><span class="token class-name">Map</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">></span></span> props<span class="token punctuation">)</span></span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>Parameters:</strong><br> ​</p><ul><li><p>measurementID: The name of this measurement, typically the name of the sensor.</p></li><li><p>type: The data type, now support six types: <code>BOOLEAN</code>, <code>INT32</code>, <code>INT64</code>, <code>FLOAT</code>, <code>DOUBLE</code>, <code>TEXT</code>;</p></li><li><p>encoding: The data encoding.</p></li><li><p>compression: The data compression.</p></li><li><p>props: Properties for special data types.Such as <code>max_point_number</code> for <code>FLOAT</code> and <code>DOUBLE</code>, <code>max_string_length</code> for<br><code>TEXT</code>. Use as string pairs into a map such as ("max_point_number", "3").</p></li></ul><blockquote><p><strong>Notice:</strong> Although one measurement name can be used in multiple deltaObjects, the properties cannot be changed. I.e.<br> it's not allowed to add one measurement name for multiple times with different type or encoding.<br> Here is a bad example:</p></blockquote><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><span class="token comment">// The measurement "sensor_1" is float type</span></span> |
| <span class="line"><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">"sensor_1"</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> |
| <span class="line"></span> |
| <span class="line"><span class="token comment">// This call will throw a WriteProcessException exception</span></span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li></ol><p>addMeasurement(new MeasurementSchema("sensor_1", TSDataType.INT32, TSEncoding.RLE));</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"></div></div><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line"></span> |
| <span class="line">3. insert and write data continually.</span> |
| <span class="line"></span> |
| <span class="line"> Use this interface to create a new \`TSRecord\`(a timestamp and device pair).</span> |
| <span class="line"> </span> |
| <span class="line"> \`\`\`java</span> |
| <span class="line"> public TSRecord(long timestamp, String deviceId)</span> |
| <span class="line"> \`\`\`</span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><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><pre><code>Then create a \`DataPoint\`(a measurement and value pair), and use the addTuple method to add the DataPoint to the correct |
| TsRecord. |
| |
| Use this method to write |
| |
| \`\`\`java |
| public void write(TSRecord record) throws IOException, WriteProcessException |
| </code></pre><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line"></span> |
| <span class="line">4. call \`close\` to finish this writing process. </span> |
| <span class="line"></span> |
| <span class="line"> \`\`\`java</span> |
| <span class="line"> public void close() throws IOException</span> |
| <span class="line"> \`\`\`</span> |
| <span class="line"></span> |
| <span class="line">We are also able to write data into a closed TsFile.</span> |
| <span class="line"></span> |
| <span class="line">1. Use \`ForceAppendTsFileWriter\` to open a closed file.</span> |
| <span class="line"></span> |
| <span class="line"> \`\`\`java</span> |
| <span class="line"> public ForceAppendTsFileWriter(File file) throws IOException</span> |
| <span class="line"> \`\`\`</span> |
| <span class="line"></span> |
| <span class="line">2. call \`doTruncate\` truncate the part of Metadata</span> |
| <span class="line"></span> |
| <span class="line">3. Then use \`ForceAppendTsFileWriter\` to construct a new \`TsFileWriter\`</span> |
| <span class="line"></span> |
| <span class="line">\`\`\`java</span> |
| <span class="line">public TsFileWriter(TsFileIOWriter fileWriter) throws IOException</span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><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><p>Please note, we should redo the step of adding measurements before writing new data to the TsFile.</p><h4 id="example-for-writing-a-tsfile" tabindex="-1"><a class="header-anchor" href="#example-for-writing-a-tsfile"><span>Example for writing a TsFile</span></a></h4><p>You should install TsFile to your local maven repository.</p><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre><code><span class="line">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></span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>You could write a TsFile by constructing <strong>TSRecord</strong> if you have the <strong>non-aligned</strong> (e.g. not all sensors contain values) time series data.</p><p>A more thorough example can be found at <code>/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTSRecord.java</code></p><p>You could write a TsFile by constructing <strong>Tablet</strong> if you have the <strong>aligned</strong> time series data.</p><p>A more thorough example can be found at <code>/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTablet.java</code></p><p>You could write data into a closed TsFile by using <strong>ForceAppendTsFileWriter</strong>.</p><p>A more thorough example can be found at <code>/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileForceAppendWrite.java</code></p><h4 id="interface-for-reading-tsfile" tabindex="-1"><a class="header-anchor" href="#interface-for-reading-tsfile"><span>Interface for Reading TsFile</span></a></h4><ul><li>Definition of Path</li></ul><p>A path is a dot-separated string which uniquely identifies a time-series in TsFile, e.g., "root.area_1.device_1.sensor_1".<br> The last section "sensor_1" is called "measurementId" while the remaining parts "root.area_1.device_1" is called deviceId.<br> As mentioned above, the same measurement in different devices has the same data type and encoding, and devices are also unique.</p><p>In read interfaces, The parameter <code>paths</code> indicates the measurements to be selected.</p><p>Path instance can be easily constructed through the class <code>Path</code>. For example:</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><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">"device_1.sensor_1"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>We will pass an ArrayList of paths for final query call to support multiple paths.</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><span class="token class-name">List</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Path</span><span class="token punctuation">></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"><</span><span class="token class-name">Path</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span> |
| <span class="line">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">"device_1.sensor_1"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span> |
| <span class="line">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">"device_1.sensor_3"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><blockquote><p><strong>Notice:</strong> When constructing a Path, the format of the parameter should be a dot-separated string, the last part will<br> be recognized as measurementId while the remaining parts will be recognized as deviceId.</p></blockquote><ul><li><p>Definition of Filter</p></li><li><p>Usage Scenario<br> Filter is used in TsFile reading process to select data satisfying one or more given condition(s).</p></li><li><p>IExpression<br> The <code>IExpression</code> is a filter expression interface and it will be passed to our final query call.<br> We create one or more filter expressions and may use binary filter operators to link them to our final expression.</p></li><li><p><strong>Create a Filter Expression</strong></p><p>There are two types of filters.</p><ul><li><p>TimeFilter: A filter for <code>time</code> in time-series data.</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">IExpression timeFilterExpr = new GlobalTimeExpression(TimeFilter);</span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>Use the following relationships to get a <code>TimeFilter</code> object (value is a long int variable).</p><table><thead><tr><th>Relationship</th><th>Description</th></tr></thead><tbody><tr><td>TimeFilter.eq(value)</td><td>Choose the time equal to the value</td></tr><tr><td><a href="http://TimeFilter.lt" target="_blank" rel="noopener noreferrer">TimeFilter.lt</a>(value)</td><td>Choose the time less than the value</td></tr><tr><td><a href="http://TimeFilter.gt" target="_blank" rel="noopener noreferrer">TimeFilter.gt</a>(value)</td><td>Choose the time greater than the value</td></tr><tr><td>TimeFilter.ltEq(value)</td><td>Choose the time less than or equal to the value</td></tr><tr><td>TimeFilter.gtEq(value)</td><td>Choose the time greater than or equal to the value</td></tr><tr><td>TimeFilter.notEq(value)</td><td>Choose the time not equal to the value</td></tr><tr><td>TimeFilter.not(TimeFilter)</td><td>Choose the time not satisfy another TimeFilter</td></tr></tbody></table></li><li><p>ValueFilter: A filter for <code>value</code> in time-series data.</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">IExpression valueFilterExpr = new SingleSeriesExpression(Path, ValueFilter);</span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>The usage of <code>ValueFilter</code> is the same as using <code>TimeFilter</code>, just to make sure that the type of the value<br> equal to the measurement's(defined in the path).</p></li></ul></li><li><p><strong>Binary Filter Operators</strong></p><p>Binary filter operators can be used to link two single expressions.</p><ul><li>BinaryExpression.and(Expression, Expression): Choose the value satisfy for both expressions.</li><li>BinaryExpression.or(Expression, Expression): Choose the value satisfy for at least one expression.</li></ul></li></ul><p>Filter Expression Examples</p><ul><li><p><strong>TimeFilterExpression Examples</strong></p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><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></span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div></li></ul><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line"> \`\`\`java</span> |
| <span class="line"> IExpression timeFilterExpr = new GlobalTimeExpression(TimeFilter.ltEq(15)); // series time <= 15</span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"> <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 < 15</span></span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><pre><code>\`\`\`java |
| </code></pre><p>IExpression timeFilterExpr = new GlobalTimeExpression(TimeFilter.gtEq(15)); // series time >= 15<br><code></code>java<br> IExpression timeFilterExpr = new GlobalTimeExpression(TimeFilter.notEq(15)); // series time != 15</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line"> \`\`\`java</span> |
| <span class="line"> IExpression timeFilterExpr = BinaryExpression.and(</span> |
| <span class="line"> new GlobalTimeExpression(TimeFilter.gtEq(15L)),</span> |
| <span class="line"> new GlobalTimeExpression(TimeFilter.lt(25L))); // 15 <= series time < 25</span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><pre><code>\`\`\`java |
| IExpression timeFilterExpr = BinaryExpression.or( |
| new GlobalTimeExpression(TimeFilter.gtEq(15L)), |
| new GlobalTimeExpression(TimeFilter.lt(25L))); // series time >= 15 or series time < 25 |
| \`\`\` |
| </code></pre><ul><li>Read Interface</li></ul><p>First, we open the TsFile and get a <code>ReadOnlyTsFile</code> instance from a file path string <code>path</code>.</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><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> |
| <span class="line"> </span> |
| <span class="line"><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> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Next, we prepare the path array and query expression, then get final <code>QueryExpression</code> object by this interface:</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><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> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>The ReadOnlyTsFile class has two <code>query</code> method to perform a query.</p><ul><li><p><strong>Method 1</strong></p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><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> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div></li><li><p><strong>Method 2</strong></p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><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></span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>This method is designed for advanced applications such as the TsFile-Spark Connector.</p><ul><li><p><strong>params</strong> : For method 2, two additional parameters are added to support partial query:</p><ul><li><code>partitionStartOffset</code>: start offset for a TsFile</li><li><code>partitionEndOffset</code>: end offset for a TsFile</li></ul><blockquote><p><strong>What is Partial Query ?</strong></p><p>In some distributed file systems(e.g. HDFS), a file is split into severval parts which are called "Blocks" and stored in different nodes. Executing a query paralleled in each nodes involved makes better efficiency. Thus Partial Query is needed. Paritial Query only selects the results stored in the part split by <code>QueryConstant.PARTITION_START_OFFSET</code> and <code>QueryConstant.PARTITION_END_OFFSET</code> for a TsFile.</p></blockquote></li></ul></li><li><p>QueryDataset Interface</p></li></ul><p>The query performed above will return a <code>QueryDataset</code> object.</p><p>Here's the useful interfaces for user.</p><ul><li><p><code>bool hasNext();</code></p><p>Return true if this dataset still has elements.</p></li><li><p><code>List<Path> getPaths()</code></p><p>Get the paths in this data set.</p></li><li><p><code>List<TSDataType> getDataTypes();</code></p></li></ul><p>Get the data types. The class TSDataType is an enum class, the value will be one of the following:</p><pre><code> BOOLEAN, |
| INT32, |
| INT64, |
| FLOAT, |
| DOUBLE, |
| TEXT; |
| </code></pre><ul><li><p><code>RowRecord next() throws IOException;</code></p><p>Get the next record.</p><p>The class <code>RowRecord</code> consists of a <code>long</code> timestamp and a <code>List<Field></code> for data in different sensors,<br> we can use two getter methods to get them.</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><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> |
| <span class="line"><span class="token class-name">List</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Field</span><span class="token punctuation">></span></span> <span class="token function">getFields</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><p>To get data from one Field, use these methods:</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><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> |
| <span class="line"><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></span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div></li></ul><h4 id="example-for-reading-an-existing-tsfile" tabindex="-1"><a class="header-anchor" href="#example-for-reading-an-existing-tsfile"><span>Example for reading an existing TsFile</span></a></h4><p>You should install TsFile to your local maven repository.</p><p>A more thorough example with query statement can be found at<br><code>/tsfile/example/src/main/java/org/apache/iotdb/tsfile/TsFileRead.java</code></p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><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> |
| <span class="line"><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> |
| <span class="line"><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> |
| <span class="line"><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> |
| <span class="line"><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> |
| <span class="line"><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> |
| <span class="line"><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> |
| <span class="line"><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> |
| <span class="line"><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> |
| <span class="line"><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> |
| <span class="line"><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> |
| <span class="line"><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> |
| <span class="line"><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> |
| <span class="line"><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> |
| <span class="line"></span> |
| <span class="line"><span class="token doc-comment comment">/**</span> |
| <span class="line"> * The class is to show how to read TsFile file named "test.tsfile".</span> |
| <span class="line"> * The TsFile file "test.tsfile" is generated from class TsFileWrite.</span> |
| <span class="line"> * Run TsFileWrite to generate the test.tsfile first</span> |
| <span class="line"> */</span></span> |
| <span class="line"><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> |
| <span class="line"> <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"><</span><span class="token class-name">Path</span><span class="token punctuation">></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> |
| <span class="line"> <span class="token keyword">throws</span> <span class="token class-name">IOException</span> <span class="token punctuation">{</span></span> |
| <span class="line"> <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> |
| <span class="line"> <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> |
| <span class="line"> <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> |
| <span class="line"> <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> |
| <span class="line"> <span class="token punctuation">}</span></span> |
| <span class="line"> <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">"------------"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span> |
| <span class="line"> <span class="token punctuation">}</span></span> |
| <span class="line"></span> |
| <span class="line"> <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> |
| <span class="line"></span> |
| <span class="line"> <span class="token comment">// file path</span></span> |
| <span class="line"> <span class="token class-name">String</span> path <span class="token operator">=</span> <span class="token string">"test.tsfile"</span><span class="token punctuation">;</span></span> |
| <span class="line"></span> |
| <span class="line"> <span class="token comment">// create reader and get the readTsFile interface</span></span> |
| <span class="line"> <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> |
| <span class="line"> <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> |
| <span class="line"> <span class="token comment">// use these paths(all sensors) for all the queries</span></span> |
| <span class="line"> <span class="token class-name">ArrayList</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Path</span><span class="token punctuation">></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"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span> |
| <span class="line"> 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">"device_1.sensor_1"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span> |
| <span class="line"> 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">"device_1.sensor_2"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span> |
| <span class="line"> 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">"device_1.sensor_3"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span> |
| <span class="line"></span> |
| <span class="line"> <span class="token comment">// no query statement</span></span> |
| <span class="line"> <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> |
| <span class="line"></span> |
| <span class="line"> <span class="token comment">//close the reader when you left</span></span> |
| <span class="line"> reader<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span> |
| <span class="line"> <span class="token punctuation">}</span></span> |
| <span class="line"><span class="token punctuation">}</span></span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><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="change-tsfile-configuration" tabindex="-1"><a class="header-anchor" href="#change-tsfile-configuration"><span>Change TsFile Configuration</span></a></h3><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><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></span> |
| <span class="line">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></span> |
| <span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div>`,72)]))}const c=n(p,[["render",l],["__file","Programming-TsFile-API.html.vue"]]),r=JSON.parse('{"path":"/UserGuide/V1.1.x/API/Programming-TsFile-API.html","title":"","lang":"en-US","frontmatter":{"description":"TsFile API TsFile is a file format of Time Series used in IoTDB. This session introduces the usage of this file format. TsFile library Installation There are two ways to use TsF...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://iotdb.apache.org/zh/UserGuide/V1.1.x/API/Programming-TsFile-API.html"}],["meta",{"property":"og:url","content":"https://iotdb.apache.org/UserGuide/V1.1.x/API/Programming-TsFile-API.html"}],["meta",{"property":"og:site_name","content":"IoTDB Website"}],["meta",{"property":"og:description","content":"TsFile API TsFile is a file format of Time Series used in IoTDB. This session introduces the usage of this file format. TsFile library Installation There are two ways to use TsF..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-07-10T03:11:17.000Z"}],["meta",{"property":"article:modified_time","content":"2023-07-10T03:11:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"\\",\\"image\\":[\\"\\"],\\"dateModified\\":\\"2023-07-10T03:11:17.000Z\\",\\"author\\":[]}"]]},"headers":[{"level":2,"title":"TsFile API","slug":"tsfile-api","link":"#tsfile-api","children":[{"level":3,"title":"TsFile library Installation","slug":"tsfile-library-installation","link":"#tsfile-library-installation","children":[]},{"level":3,"title":"TsFile Usage","slug":"tsfile-usage","link":"#tsfile-usage","children":[]},{"level":3,"title":"Change TsFile Configuration","slug":"change-tsfile-configuration","link":"#change-tsfile-configuration","children":[]}]}],"git":{"createdTime":1688958677000,"updatedTime":1688958677000,"contributors":[{"name":"CritasWang","email":"critas@outlook.com","commits":1}]},"readingTime":{"minutes":7.93,"words":2379},"filePathRelative":"UserGuide/V1.1.x/API/Programming-TsFile-API.md","localizedDate":"July 10, 2023","autoDesc":true}');export{c as comp,r as data}; |