You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by qi...@apache.org on 2020/03/09 01:16:12 UTC

[incubator-iotdb] branch master updated: [IOTDB-399] add Chinese user guide (#884)

This is an automated email from the ASF dual-hosted git repository.

qiaojialin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 28c35aa  [IOTDB-399] add Chinese user guide (#884)
28c35aa is described below

commit 28c35aa8632f7abe28331d927c2d2729d2ed6e92
Author: SailVR <37...@users.noreply.github.com>
AuthorDate: Mon Mar 9 09:16:03 2020 +0800

    [IOTDB-399] add Chinese user guide (#884)
    
    * Update docs/Documentation-CHN/UserGuide/6-System Tools/7-Monitor and Log Tools.md
    Co-Authored-By: Zesong Sun <sz...@mails.tsinghua.edu.cn>
---
 .../UserGuide/0-Get Started/1-QuickStart.md        |  12 +-
 .../UserGuide/0-Get Started/3-Publication.md       |  10 +-
 .../UserGuide/3-Server/3-Cluster Setup.md          |   6 +-
 .../4-Client/1-Command Line Interface (CLI).md     |   6 +-
 .../4-Client/2-Programming - Native API.md         |  12 +-
 .../4-Client/4-Programming - Other Languages.md    |  48 ++-
 .../2-DML (Data Manipulation Language).md          | 382 ++++++++++++++++++++-
 .../UserGuide/6-System Tools/4-Watermark Tool.md   |   4 -
 .../6-System Tools/7-Monitor and Log Tools.md      | 198 ++++++++++-
 .../7-Ecosystem Integration/3-Spark TsFile.md      | 327 +++++++++++++++++-
 .../7-Ecosystem Integration/4-Spark IoTDB.md       | 159 ++++++++-
 .../UserGuide/0-Get Started/3-Publication.md       |  10 +-
 .../UserGuide/4-Client/3-Programming - JDBC.md     |  14 +-
 13 files changed, 1151 insertions(+), 37 deletions(-)

diff --git a/docs/Documentation-CHN/UserGuide/0-Get Started/1-QuickStart.md b/docs/Documentation-CHN/UserGuide/0-Get Started/1-QuickStart.md
index 7b19497..9cc1f95 100755
--- a/docs/Documentation-CHN/UserGuide/0-Get Started/1-QuickStart.md	
+++ b/docs/Documentation-CHN/UserGuide/0-Get Started/1-QuickStart.md	
@@ -72,7 +72,7 @@ IoTDB支持多种安装途径。用户可以使用三种方式对IoTDB进行安
   * 日志配置模块 (`logback.xml`). 
 
 想要了解更多,请浏览[Chapter3: Server](https://iotdb.apache.org/#/Documents/progress/chap3/sec1)
-	
+​	
 
 ## IoTDB试用
 
@@ -281,3 +281,13 @@ Windows系统停止命令如下:
 ```
 > $sbin\stop-server.bat
 ```
+
+## 只建立客户端
+
+在incubator-iotdb的根路径下:
+
+```
+> mvn clean package -pl client -am -DskipTests
+```
+
+构建后,IoTDB客户端将位于文件夹“ client / target / iotdb-client- {project.version}”下。
diff --git a/docs/Documentation-CHN/UserGuide/0-Get Started/3-Publication.md b/docs/Documentation-CHN/UserGuide/0-Get Started/3-Publication.md
index 90cab63..7b5ce0f 100644
--- a/docs/Documentation-CHN/UserGuide/0-Get Started/3-Publication.md	
+++ b/docs/Documentation-CHN/UserGuide/0-Get Started/3-Publication.md	
@@ -7,9 +7,9 @@
     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
@@ -29,3 +29,9 @@ Apache IoTDB 始于清华大学软件学院。IoTDB是一个用于管理大量
 * [Matching Consecutive Subpatterns over Streaming Time Series](https://link.springer.com/chapter/10.1007/978-3-319-96893-3_8), Rong Kang and Chen Wang and Peng Wang and Yuting Ding and Jianmin Wang. APWeb/WAIM 2018.
 * [KV-match: A Subsequence Matching Approach Supporting Normalization and Time Warping](https://www.semanticscholar.org/paper/KV-match%3A-A-Subsequence-Matching-Approach-and-Time-Wu-Wang/9ed84cb15b7e5052028fc5b4d667248713ac8592), Jiaye Wu and Peng Wang and Chen Wang and Wei Wang and Jianmin Wang. ICDE 2019.
 * 我们还研发了面向时间序列数据库的Benchmark工具: [https://github.com/thulab/iotdb-benchmark](https://github.com/thulab/iotdb-benchmark)
+
+# Benchmark工具
+
+我们还研发了面向时间序列数据库的Benchmark工具: 
+
+https://github.com/thulab/iotdb-benchmark
\ No newline at end of file
diff --git a/docs/Documentation-CHN/UserGuide/3-Server/3-Cluster Setup.md b/docs/Documentation-CHN/UserGuide/3-Server/3-Cluster Setup.md
index be153fc..4ff45c0 100644
--- a/docs/Documentation-CHN/UserGuide/3-Server/3-Cluster Setup.md	
+++ b/docs/Documentation-CHN/UserGuide/3-Server/3-Cluster Setup.md	
@@ -7,9 +7,9 @@
     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
@@ -20,4 +20,6 @@
 -->
 # 第3章: 服务器端
 
+## 集群设置
+
 Coming Soon.
\ No newline at end of file
diff --git a/docs/Documentation-CHN/UserGuide/4-Client/1-Command Line Interface (CLI).md b/docs/Documentation-CHN/UserGuide/4-Client/1-Command Line Interface (CLI).md
index e1bcff3..b1b41d5 100644
--- a/docs/Documentation-CHN/UserGuide/4-Client/1-Command Line Interface (CLI).md	
+++ b/docs/Documentation-CHN/UserGuide/4-Client/1-Command Line Interface (CLI).md	
@@ -7,9 +7,9 @@
     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
@@ -30,7 +30,7 @@
 
 <!-- /TOC -->
 
-# Command Line Interface (CLI)
+# 命令行接口(CLI)
 IOTDB为用户提供Client/Shell工具用于启动客户端和服务端程序。下面介绍每个Client/Shell工具的运行方式和相关参数。
 > \$IOTDB\_HOME表示IoTDB的安装目录所在路径。
 
diff --git a/docs/Documentation-CHN/UserGuide/4-Client/2-Programming - Native API.md b/docs/Documentation-CHN/UserGuide/4-Client/2-Programming - Native API.md
index 86d6a57..25bb3ee 100644
--- a/docs/Documentation-CHN/UserGuide/4-Client/2-Programming - Native API.md	
+++ b/docs/Documentation-CHN/UserGuide/4-Client/2-Programming - Native API.md	
@@ -23,6 +23,8 @@
 
 # 编程 - 原生接口
 
+## 使用
+
 ## 依赖
 
 * JDK >= 1.8
@@ -52,8 +54,8 @@
 
 * 初始化Session
   ​	Session(String host, int port)
-  	Session(String host, String port, String username, String password)
-  	Session(String host, int port, String username, String password)
+  ​	Session(String host, String port, String username, String password)
+  ​	Session(String host, int port, String username, String password)
 
 * 开启Session
   ​	Session.open()
@@ -70,7 +72,7 @@
 * 删除单个或多个存储组
 
   ​	TSStatus deleteStorageGroup(String storageGroup)
-  	TSStatus deleteStorageGroups(List<String> storageGroups)
+  ​	TSStatus deleteStorageGroups(List<String> storageGroups)
 
 * 创建单个时间序列
 
@@ -79,12 +81,12 @@
 * 删除一个或多个时间序列
 
   ​	TSStatus deleteTimeseries(String path)
-  	TSStatus deleteTimeseries(List<String> paths)
+  ​	TSStatus deleteTimeseries(List<String> paths)
 
 * 删除某一特定时间前的时间序列
 
   ​	TSStatus deleteData(String path, long time)
-  	TSStatus deleteData(List<String> paths, long time)
+  ​	TSStatus deleteData(List<String> paths, long time)
 
 * 插入时序数据
 
diff --git a/docs/Documentation-CHN/UserGuide/4-Client/4-Programming - Other Languages.md b/docs/Documentation-CHN/UserGuide/4-Client/4-Programming - Other Languages.md
index 506d497..094d278 100644
--- a/docs/Documentation-CHN/UserGuide/4-Client/4-Programming - Other Languages.md	
+++ b/docs/Documentation-CHN/UserGuide/4-Client/4-Programming - Other Languages.md	
@@ -7,9 +7,9 @@
     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
@@ -21,4 +21,46 @@
 # 第4章: 客户端
 ## 其他语言
 
-Coming Soon.
\ No newline at end of file
+## Python API
+
+### 1. 介绍
+
+这是一个如何使用thrift rpc接口通过python连接到IoTDB的示例。 在Linux或Windows上情况会有所不同,我们将介绍如何分别在两个系统上进行操作。
+
+### 2. 先决条件
+
+首选python3.7或更高版本。
+
+您必须安装Thrift(0.11.0或更高版本)才能将我们的Thrift文件编译为python代码。 
+
+下面是官方安装教程:
+
+```
+http://thrift.apache.org/docs/install/
+```
+
+### 3. 如何获取Python库
+
+#### 方案1: pip install
+
+您可以在https://pypi.org/project/apache-iotdb/上找到Apache IoTDB Python客户端API软件包。
+
+下载命令为:
+
+```
+pip install apache-iotdb
+```
+
+#### 方案2: 使用我们提供的编译脚本
+
+如果你在路径中添加了Thrift可执行文件,则可以运行`client-py/compile.sh`或
+  `client-py \ compile.bat`,或者你必须对其进行修改以将变量`THRIFT_EXE`设置为指向你的可执行文件。 这将在`target`文件夹下生成节俭源,你可以将其添加到你的`PYTHONPATH`,以便你可以在代码中使用该库。 请注意,脚本通过相对路径找到节俭的源文件,因此,如果将脚本移动到其他位置,它们将不再有效。
+
+#### 方案3:thrift的基本用法
+
+或者,如果您了解thrift的基本用法,则只能在以下位置下载Thrift源文件:
+`service-rpc\src\main\thrift\rpc.thrift`,并且只需使用`thrift -gen py -out ./target/iotdb rpc.thrift`生成python库。
+
+### 4. 示例代码
+
+我们在`client-py / src/ client_example.py`中提供了一个示例,说明如何使用Thrift库连接到IoTDB,请先仔细阅读,然后再编写自己的代码。
diff --git a/docs/Documentation-CHN/UserGuide/5-Operation Manual/2-DML (Data Manipulation Language).md b/docs/Documentation-CHN/UserGuide/5-Operation Manual/2-DML (Data Manipulation Language).md
index 2b5647c..6b1afd6 100644
--- a/docs/Documentation-CHN/UserGuide/5-Operation Manual/2-DML (Data Manipulation Language).md	
+++ b/docs/Documentation-CHN/UserGuide/5-Operation Manual/2-DML (Data Manipulation Language).md	
@@ -7,9 +7,9 @@
     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
@@ -309,8 +309,384 @@ select last id, status, temperature from root.ln.wf01 disable align
 |  9   | root.ln.wf01.wt01.temperature| 35.7  |
 ```
 
+### 自动填充
+
+在IoTDB的实际使用中,当进行时间序列的查询操作时,可能会出现在某些时间点值为null的情况,这会妨碍用户进行进一步的分析。 为了更好地反映数据更改的程度,用户希望可以自动填充缺失值。 因此,IoTDB系统引入了自动填充功能。
+
+自动填充功能是指对单列或多列执行时间序列查询时,根据用户指定的方法和有效时间范围填充空值。 如果查询点的值不为null,则填充功能将不起作用。
+
+> 注意:在当前版本中,IoTDB为用户提供两种方法:Previous 和Linear。 Previous 方法用前一个值填充空白。 Linear方法通过线性拟合来填充空白。 并且填充功能只能在执行时间点查询时使用。
+
+#### 填充功能
+
+- Previous功能
+
+当查询的时间戳值为空时,将使用前一个时间戳的值来填充空白。 形式化的先前方法如下(有关详细语法,请参见第7.1.3.6节):
+
+```
+select <path> from <prefixPath> where time = <T> fill(<data_type>[previous, <before_range>], …)
+```
+
+表3-4给出了所有参数的详细说明。
+
+<center>**表3-4previous填充参数列表**
+
+| 参数名称(不区分大小写) | 解释                                                         |
+| :----------------------- | :----------------------------------------------------------- |
+| path, prefixPath         | 查询路径; 必填项                                            |
+| T                        | 查询时间戳(只能指定一个); 必填项                          |
+| data\_type               | 填充方法使用的数据类型。 可选值是int32,int64,float,double,boolean,text; 可选字段 |
+| before\_range            | 表示前一种方法的有效时间范围。 当[T-before \ _range,T]范围内的值存在时,前一种方法将起作用。 如果未指定before_range,则before_range会使用默认值default_fill_interval; -1表示无穷大; 可选字段 |
+
+</center>
+
+在这里,我们举一个使用先前方法填充空值的示例。 SQL语句如下:
+
+```
+select temperature from root.sgcc.wf03.wt01 where time = 2017-11-01T16:37:50.000 fill(float[previous, 1m]) 
+```
+
+意思是:
+
+由于时间根目录root.sgcc.wf03.wt01.temperature在2017-11-01T16:37:50.000为空,因此系统使用以前的时间戳2017-11-01T16:37:00.000(且时间戳位于[2017-11-01T16:36:50.000, 2017-11-01T16:37:50.000]范围)进行填充和显示。
+
+在[样例数据中](https://raw.githubusercontent.com/apache/incubator-iotdb/master/docs/Documentation/OtherMaterial-Sample%20Data.txt), 该语句的执行结果如下所示:
+
+<center><img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/13203019/51577616-67df0280-1ef5-11e9-9dff-2eb8342074eb.jpg"></center>
+
+值得注意的是,如果在指定的有效时间范围内没有值,系统将不会填充空值,如下所示:
+
+<center><img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/13203019/51577679-9f4daf00-1ef5-11e9-8d8b-06a58de6efc1.jpg"></center>
+
+- Linear方法
+
+当查询的时间戳值为空时,将使用前一个和下一个时间戳的值来填充空白。 形式化线性方法如下:
+
+```
+select <path> from <prefixPath> where time = <T> fill(<data_type>[linear, <before_range>, <after_range>]…)
+```
+
+表3-5中给出了所有参数的详细说明。
+
+<center>**表3-5线性填充参数列表**
+
+| 参数名称(不区分大小写)    | 解释                                                         |
+| :-------------------------- | :----------------------------------------------------------- |
+| path, prefixPath            | 查询路径; 必填项                                            |
+| T                           | 查询时间戳(只能指定一个); 必填项                          |
+| data_type                   | 填充方法使用的数据类型。 可选值是int32,int64,float,double,boolean,text; 可选字段 |
+| before\_range, after\_range | 表示线性方法的有效时间范围。 当[T-before_range,T + after_range]范围内的值存在时,前一种方法将起作用。 如果未明确指定before_range和after_range,则使用default\_fill\_interval。 -1表示无穷大; 可选字段 |
+
+</center>
+
+在这里,我们举一个使用线性方法填充空值的示例。 SQL语句如下:
+
+```
+select temperature from root.sgcc.wf03.wt01 where time = 2017-11-01T16:37:50.000 fill(float [linear, 1m, 1m])
+```
+
+意思是:
+
+由于时间根目录root.sgcc.wf03.wt01.temperature在2017-11-01T16:37:50.000为空,因此系统使用以前的时间戳2017-11-01T16:37:00.000(且时间戳位于[2017- 11-01T16:36:50.000,2017-11-01T16:37:50.000]时间范围)及其值21.927326,下一个时间戳记2017-11-01T16:38:00.000(且时间戳记位于[2017-11-11] 01T16:37:50.000、2017-11-01T16:38:50.000]时间范围)及其值25.311783以执行线性拟合计算:
+
+21.927326 +(25.311783-21.927326)/ 60s * 50s = 24.747707
+
+在 [样例数据](https://raw.githubusercontent.com/apache/incubator-iotdb/master/docs/Documentation/OtherMaterial-Sample%20Data.txt), 该语句的执行结果如下所示:
+
+<center><img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/13203019/51577727-d4f29800-1ef5-11e9-8ff3-3bb519da3993.jpg"></center>
+
+#### 数据类型和填充方法之间的对应关系
+
+数据类型和支持的填充方法如表3-6所示。
+
+<center>**表3-6数据类型和支持的填充方法**
+
+| 数据类型 | 支持的填充方法   |
+| :------- | :--------------- |
+| boolean  | previous         |
+| int32    | previous, linear |
+| int64    | previous, linear |
+| float    | previous, linear |
+| double   | previous, linear |
+| text     | previous         |
+
+</center>
+
+值得注意的是,IoTDB将针对数据类型不支持的填充方法给出错误提示,如下所示:
+
+<center><img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/13203019/51577741-e340b400-1ef5-11e9-9238-a4eaf498ab84.jpg"></center>
+
+如果未指定fill方法,则每种数据类型均具有其自己的默认fill方法和参数。 对应关系如表3-7所示。
+
+<center>**表3-7各种数据类型的默认填充方法和参数**
+
+| 数据类型 | 默认填充方法和参数     |
+| :------- | :--------------------- |
+| boolean  | previous, 600000       |
+| int32    | linear, 600000, 600000 |
+| int64    | linear, 600000, 600000 |
+| float    | linear, 600000, 600000 |
+| double   | linear, 600000, 600000 |
+| text     | previous, 600000       |
+
+</center>
+
+> 注意:在版本0.7.0中,应在Fill语句中至少指定一种填充方法。
+
+### 对查询结果的行和列控制
+
+IoTDB提供 [LIMIT/SLIMIT](/#/Documents/progress/chap5/sec4) 子句和 [OFFSET/SOFFSET](/#/Documents/progress/chap5/sec4) 子句,以使用户可以更好地控制查询结果。使用LIMIT和SLIMIT子句可让用户控制查询结果的行数和列数,
+并且使用OFFSET和SOFSET子句允许用户设置结果显示的起始位置。
+
+请注意,按组查询不支持LIMIT和OFFSET。
+
+本章主要介绍查询结果的行和列控制的相关示例。你还可以使用 [Java JDBC](/#/Documents/progress/chap4/sec2) 标准接口执行查询。
+
+#### 查询结果的行控制
+
+通过使用LIMIT和OFFSET子句,用户可以以与行相关的方式控制查询结果。 我们将通过以下示例演示如何使用LIMIT和OFFSET子句。
+
+- 示例1:基本的LIMIT子句
+
+SQL语句是:
+
+```
+select status, temperature from root.ln.wf01.wt01 limit 10
+```
+
+意思是:
+
+所选设备为ln组wf01工厂wt01设备; 选择的时间序列是“状态”和“温度”。 SQL语句要求返回查询结果的前10行。
+
+结果如下所示:
+
+<center><img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/13203019/51577752-efc50c80-1ef5-11e9-9071-da2bbd8b9bdd.jpg"></center>
+
+- 示例2:带OFFSET的LIMIT子句
+
+SQL语句是:
+
+```
+select status, temperature from root.ln.wf01.wt01 limit 5 offset 3
+```
+
+意思是:
+
+所选设备为ln组wf01工厂wt01设备; 选择的时间序列是“状态”和“温度”。 SQL语句要求返回查询结果的第3至7行(第一行编号为0行)。
+
+结果如下所示:
+
+<center><img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/13203019/51577773-08352700-1ef6-11e9-883f-8d353bef2bdc.jpg"></center>
+
+- 示例3:LIMIT子句与WHERE子句结合
+
+SQL语句是:
+
+```
+select status,temperature from root.ln.wf01.wt01 where time > 2017-11-01T00:05:00.000 and time< 2017-11-01T00:12:00.000 limit 2 offset 3
+```
+
+意思是:
+
+所选设备为ln组wf01工厂wt01设备; 选择的时间序列是“状态”和“温度”。 SQL语句要求返回时间“ 2017-11-01T00:05:00.000”和“ 2017-11-01T00:12:00.000”之间的状态和温度传感器值的第3至4行(第一行) 编号为第0行)。
+
+结果如下所示:
+
+<center><img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/13203019/51577789-15521600-1ef6-11e9-86ca-d7b2c947367f.jpg"></center>
+
+- 示例4:LIMIT子句与GROUP BY子句组合
+
+SQL语句是:
+
+```
+select count(status), max_value(temperature) from root.ln.wf01.wt01 group by (1d,[2017-11-01T00:00:00, 2017-11-07T23:00:00]) limit 5 offset 3
+```
+
+意思是:
+
+SQL语句子句要求返回查询结果的第3至7行(第一行编号为0行)。
+
+结果如下所示:
+
+<center><img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/13203019/51577796-1e42e780-1ef6-11e9-8987-be443000a77e.jpg"></center>
+
+值得注意的是,由于当前的FILL子句只能在某个时间点填充时间序列的缺失值,也就是说,FILL子句的执行结果恰好是一行,因此LIMIT和OFFSET不会是 与FILL子句结合使用,否则将提示错误。 例如,执行以下SQL语句:
+
+```
+select temperature from root.sgcc.wf03.wt01 where time = 2017-11-01T16:37:50.000 fill(float[previous, 1m]) limit 10
+```
+
+SQL语句将不会执行,并且相应的错误提示如下:
+
+<center><img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/19167280/61517266-6e2fe080-aa39-11e9-8015-154a8e8ace30.png"></center>
+
+#### 查询结果的列控制
+
+通过使用LIMIT和OFFSET子句,用户可以以与列相关的方式控制查询结果。 我们将通过以下示例演示如何使用SLIMIT和OFFSET子句。
+
+- 示例1:基本的SLIMIT子句
+
+SQL语句是:
+
+```
+select * from root.ln.wf01.wt01 where time > 2017-11-01T00:05:00.000 and time < 2017-11-01T00:12:00.000 slimit 1
+```
+
+意思是:
+
+所选设备为ln组wf01工厂wt01设备; 所选时间序列是该设备下的第一列,即电源状态。 SQL语句要求在“ 2017-11-01T00:05:00.000”和“ 2017-11-01T00:12:00.000”的时间点之间选择状态传感器值。
+
+结果如下所示:
+
+<center><img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/13203019/51577813-30bd2100-1ef6-11e9-94ef-dbeb450cf319.jpg"></center>
+
+- 示例2:带OFFSET的LIMIT子句
+
+SQL语句是:
+
+```
+select * from root.ln.wf01.wt01 where time > 2017-11-01T00:05:00.000 and time < 2017-11-01T00:12:00.000 slimit 1 soffset 1
+```
+
+意思是:
+
+所选设备为ln组wf01工厂wt01设备; 所选时间序列是该设备下的第二列,即温度。 SQL语句要求在“ 2017-11-01T00:05:00.000”和“ 2017-11-01T00:12:00.000”的时间点之间选择温度传感器值。
+
+结果如下所示:
+
+<center><img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/13203019/51577827-39adf280-1ef6-11e9-81b5-876769607cd2.jpg"></center>
+
+- 示例3:SLIMIT子句与GROUP BY子句结合
+
+SQL语句是:
+
+```
+select max_value(*) from root.ln.wf01.wt01 group by (1d, [2017-11-01T00:00:00, 2017-11-07T23:00:00]) slimit 1 soffset 1
+
+```
+
+结果如下所示:
+
+<center><img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/13203019/51577840-44688780-1ef6-11e9-8abc-04ae78efa85b.jpg"></center>
+
+- 示例4:SLIMIT子句与FILL子句结合
+
+SQL语句是:
+
+```
+select * from root.sgcc.wf03.wt01 where time = 2017-11-01T16:37:50.000 fill(float[previous, 1m]) slimit 1 soffset 1
+
+```
+
+意思是:
+
+所选设备为ln组wf01工厂wt01设备; 所选时间序列是该设备下的第二列,即温度。
+
+结果如下所示:
+
+<center><img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/13203019/51577855-4d595900-1ef6-11e9-8541-a4accd714b75.jpg"></center>
+
+值得注意的是,预期SLIMIT子句将与星形路径或前缀路径一起使用,并且当SLIMIT子句与完整路径查询一起使用时,系统将提示错误。 例如,执行以下SQL语句:
+
+```
+select status,temperature from root.ln.wf01.wt01 where time > 2017-11-01T00:05:00.000 and time < 2017-11-01T00:12:00.000 slimit 1
+
+```
+
+SQL语句将不会执行,并且相应的错误提示如下:
+
+<center><img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/13203019/51577867-577b5780-1ef6-11e9-978c-e02c1294bcc5.jpg"></center>
+
+#### Row and Column Control over Query Results
+
+除了对查询结果进行行或列控制之外,IoTDB还允许用户控制查询结果的行和列。 这是同时包含LIMIT子句和SLIMIT子句的完整示例。
+
+SQL语句是:
+
+```
+select * from root.ln.wf01.wt01 limit 10 offset 100 slimit 2 soffset 0
+
+```
+
+意思是:
+
+所选设备为ln组wf01工厂wt01设备; 所选时间序列是此设备下的第0列至第1列(第一列编号为第0列)。 SQL语句子句要求返回查询结果的第100至109行(第一行编号为0行)。
+
+结果如下所示:
+
+<center><img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/13203019/51577879-64984680-1ef6-11e9-9d7b-57dd60fab60e.jpg"></center>
+
+#### 其他结果集格式
+
+此外,IoTDB支持两种其他结果集格式:“按设备对齐”和“禁用对齐”。
+
+“按设备对齐”指示将deviceId视为一列。 因此,数据集中的列完全有限。
+
+SQL语句是:
+
+```
+select s1,s2 from root.sg1.* GROUP BY DEVICE
+
+```
+
+有关更多语法描述,请阅读SQL REFERENCE。
+
+“禁用对齐”指示结果集中每个时间序列都有3列。 有关更多语法描述,请阅读SQL REFERENCE。
+
+#### 错误处理
+
+当LIMIT / SLIMIT的参数N / SN超过结果集的大小时,IoTDB将按预期返回所有结果。 例如,原始SQL语句的查询结果由六行组成,我们通过LIMIT子句选择前100行:
+
+```
+select status,temperature from root.ln.wf01.wt01 where time > 2017-11-01T00:05:00.000 and time < 2017-11-01T00:12:00.000 limit 100
+
+```
+
+结果如下所示:
+
+<center><img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/13203019/51578187-ad9cca80-1ef7-11e9-897a-83e66a0f3d94.jpg"></center>
+
+当LIMIT / SLIMIT子句的参数N / SN超过允许的最大值(N / SN的类型为int32)时,系统将提示错误。 例如,执行以下SQL语句:
+
+```
+select status,temperature from root.ln.wf01.wt01 where time > 2017-11-01T00:05:00.000 and time < 2017-11-01T00:12:00.000 limit 1234567890123456789
+
+```
+
+SQL语句将不会执行,并且相应的错误提示如下:
+
+<center><img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/19167280/61517469-e696a180-aa39-11e9-8ca5-42ea991d520e.png"></center>
+
+当LIMIT / LIMIT子句的参数N / SN不是正整数时,系统将提示错误。 例如,执行以下SQL语句:
+
+```
+select status,temperature from root.ln.wf01.wt01 where time > 2017-11-01T00:05:00.000 and time < 2017-11-01T00:12:00.000 limit 13.1
+
+```
+
+SQL语句将不会执行,并且相应的错误提示如下:
+
+<center><img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/19167280/61518094-68d39580-aa3b-11e9-993c-fc73c27540f7.png"></center>
+
+当LIMIT子句的参数OFFSET超过结果集的大小时,IoTDB将返回空结果集。 例如,执行以下SQL语句:
+
+```
+select status,temperature from root.ln.wf01.wt01 where time > 2017-11-01T00:05:00.000 and time < 2017-11-01T00:12:00.000 limit 2 offset 6
+
+```
+
+结果如下所示:
+
+<center><img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/13203019/51578227-c60ce500-1ef7-11e9-98eb-175beb8d4086.jpg"></center>
+
+当SLIMIT子句的参数SOFFSET不小于可用时间序列数时,系统将提示错误。 例如,执行以下SQL语句:
+
+```
+select * from root.ln.wf01.wt01 where time > 2017-11-01T00:05:00.000 and time < 2017-11-01T00:12:00.000 slimit 1 soffset 2
+
+```
 
-## 数据维护
+SQL语句将不会执行,并且相应的错误提示如下:
 
 ### 数据删除
 
diff --git a/docs/Documentation-CHN/UserGuide/6-System Tools/4-Watermark Tool.md b/docs/Documentation-CHN/UserGuide/6-System Tools/4-Watermark Tool.md
index 84749b3..8afda24 100644
--- a/docs/Documentation-CHN/UserGuide/6-System Tools/4-Watermark Tool.md	
+++ b/docs/Documentation-CHN/UserGuide/6-System Tools/4-Watermark Tool.md	
@@ -32,10 +32,6 @@ under the License.
 
 2. 水印检测
 
-
-
-# IoTDB时间序列数据水印工具:用户手册
-
 这个工具提供了 1)IoTDB查询结果水印嵌入功能,2)可疑数据的水印检测功能。
 
 ## 1. 水印嵌入
diff --git a/docs/Documentation-CHN/UserGuide/6-System Tools/7-Monitor and Log Tools.md b/docs/Documentation-CHN/UserGuide/6-System Tools/7-Monitor and Log Tools.md
index d24f600..c765ee6 100644
--- a/docs/Documentation-CHN/UserGuide/6-System Tools/7-Monitor and Log Tools.md	
+++ b/docs/Documentation-CHN/UserGuide/6-System Tools/7-Monitor and Log Tools.md	
@@ -7,9 +7,9 @@
     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
@@ -29,6 +29,124 @@
 
 进入Jconsole监控页面后,首先看到的是IoTDB各类运行情况的概览。在这里,您可以看到[堆内存信息、线程信息、类信息以及服务器的CPU使用情况](https://docs.oracle.com/javase/7/docs/technotes/guides/management/jconsole.html)。
 
+#### JMX MBean监控
+
+通过使用JConsole工具并与JMX连接,您可以查看一些系统统计信息和参数。
+本节描述如何使用JConsole的“ Mbean”选项卡来监视IoTDB服务进程打开的文件数,数据文件的大小等等。 连接到JMX后,您可以通过“ MBeans”标签找到名为“ org.apache.iotdb.service”的“ MBean”,如下图所示。
+
+<img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/20263106/53316064-54aec080-3901-11e9-9a49-76563ac09192.png">
+
+Monitor下有几个属性,包括在不同文件夹中打开的文件数,数据文件大小统计信息以及某些系统参数的值。 通过双击与属性对应的值,它还可以显示该属性的折线图。 特别是,当前所有打开的文件计数统计信息仅在`MacOS`和除`CentOS`以外的大多数`Linux`发行版中受支持。 对于不支持的操作系统,这些统计信息将返回“ -2”。 有关Monitor属性的具体介绍,请参见以下部分。
+
+##### MBean监视器属性列表
+
+- DataSizeInByte
+
+| 名称 | DataSizeInByte   |
+| :--: | :--------------- |
+| 描述 | 数据文件的总大小 |
+| 单元 | Byte             |
+| 类型 | Long             |
+
+- FileNodeNum
+
+| 名称 | FileNodeNum                    |
+| :--: | :----------------------------- |
+| 描述 | ThFileNode的计数(当前不支持) |
+| 类型 | Long                           |
+
+- OverflowCacheSize
+
+| 名称 | OverflowCacheSize                |
+| :--: | :------------------------------- |
+| 描述 | 乱序数据缓存的大小(当前不支持) |
+| 单元 | Byte                             |
+| 类型 | Long                             |
+
+- BufferWriteCacheSize
+
+| Name | BufferWriteCacheSize                   |
+| :--: | :------------------------------------- |
+| 描述 | BufferedWriter缓存的大小(当前不支持) |
+| 单元 | Byte                                   |
+| 类型 | Long                                   |
+
+- BaseDirectory
+
+| 名称 | BaseDirectory      |
+| :--: | :----------------- |
+| 描述 | 数据文件的绝对目录 |
+| 类型 | String             |
+
+- WriteAheadLogStatus
+
+| 名称 | WriteAheadLogStatus                       |
+| :--: | :---------------------------------------- |
+| 描述 | 预写日志(WAL)的状态。 True表示启用WAL。 |
+| 类型 | Boolean                                   |
+
+- TotalOpenFileNum
+
+| 名称 | TotalOpenFileNum                  |
+| :--: | :-------------------------------- |
+| 描述 | IoTDB服务器进程的所有打开的文件数 |
+| 类型 | Int                               |
+
+- DeltaOpenFileNum
+
+|   名称   | DeltaOpenFileNum                    |
+| :------: | :---------------------------------- |
+|   描述   | IoTDB服务器进程的打开的TsFile文件号 |
+| 默认路径 | /data/data/settled                  |
+|   类型   | Int                                 |
+
+- WalOpenFileNum
+
+|   名称   | WalOpenFileNum                           |
+| :------: | :--------------------------------------- |
+|   描述   | TIoTDB服务器进程的已打开的预写日志文件号 |
+| 默认路径 | /data/wal                                |
+|   类型   | Int                                      |
+
+- MetadataOpenFileNum
+
+|   名称   | MetadataOpenFileNum                   |
+| :------: | :------------------------------------ |
+|   描述   | IoTDB服务器进程的已打开元数据文件号。 |
+| 默认路径 | /data/system/schema                   |
+|   类型   | Int                                   |
+
+- DigestOpenFileNum
+
+|   名称   | DigestOpenFileNum                 |
+| :------: | :-------------------------------- |
+|   描述   | IoTDB服务器进程的打开的信息文件号 |
+| 默认路径 | /data/system/info                 |
+|   类型   | Int                               |
+
+- SocketOpenFileNum
+
+| 名称 | SocketOpenFileNum                  |
+| :--: | :--------------------------------- |
+| 描述 | 操作系统的套接字链接(TCP或UDP)号 |
+| 类型 | Int                                |
+
+- MergePeriodInSecond
+
+| 名称 | MergePeriodInSecond                     |
+| :--: | :-------------------------------------- |
+| 描述 | IoTDB服务过程定期触发合并过程的时间间隔 |
+| Unit | Second                                  |
+| 类型 | Long                                    |
+
+- ClosePeriodInSecond
+
+| 名称 | ClosePeriodInSecond                             |
+| :--: | :---------------------------------------------- |
+| 描述 | IoTDB服务进程定期将内存数据刷新到磁盘的时间间隔 |
+| Unit | Second                                          |
+| 类型 | Long                                            |
+
 ### 数据统计监控
 
 本模块是IoTDB为用户提供的对其中存储数据信息的数据统计监控方式,我们会在系统中为您记录各个模块的数据统计信息,并将其汇总存入数据库中。当前版本的IoTDB提供IoTDB写入数据的统计功能。
@@ -130,7 +248,9 @@
 |服务器重启后是否重置| 是 |
 |例子| select TOTAL\_POINTS\_FAIL from root.stats.write.\<storage\_group\_name\>|
 
-> 其中,\<storage\_group\_name\> 为所需进行数据统计的存储组名称,存储组中的“.”使用“_”代替。例如:名为'root.a.b'的存储组命名为:'root\_a\_b'。
+> 其中,\<storage\_group\_name\> 为所需进行数据统计的存储组名称,存储组中的“.”使用“\_”代替。例如:名为'root.a.b'的存储组命名为:'root\_a\_b'。
+
+##### 例子
 
 下面为您展示两个具体的例子。用户可以通过`SELECT`语句查询自己所需要的写入数据统计项。(查询方法与普通的时间序列查询方式一致)
 
@@ -150,8 +270,80 @@ select TOTAL_POINTS_SUCCESS from root.stats.write.root_ln
 ```
 select MAX_VALUE(TOTAL_POINTS_SUCCESS) from root.stats.write.root_ln
 ```
+#### 文件大小监控
+
+有时我们担心IoTDB的数据文件大小如何变化,也许有助于计算剩余的磁盘空间或数据摄取速度。 文件大小监视提供了一些统计信息,以显示不同类型的文件大小如何变化。
+
+默认情况下,文件大小监视使用相同的共享参数```back_loop_period_in_second```每5秒收集一次文件大小数据 , 与写入数据监视不同,当前文件大小监视器将不会定期删除统计数据。
+
+您还可以像其他时间序列一样使用 `select` 子句来获取文件大小统计信息。
+
+以下是文件大小统计信息:
+
+- DATA
+
+|        Name        | DATA                                                         |
+| :----------------: | :----------------------------------------------------------- |
+|        描述        | 计算数据目录下所有文件大小的总和(默认为```data/data```),以字节为单位 |
+|        类型        | File size statistics                                         |
+|    时间序列名称    | root.stats.file\_size.DATA                                   |
+| 重新启动系统后重设 | 否                                                           |
+|        例子        | select DATA from root.stats.file\_size.DATA                  |
+
+- SETTLED
+
+|        Name        | SETTLED                                                      |
+| :----------------: | :----------------------------------------------------------- |
+|        描述        | 以字节为单位计算所有```TsFile```大小(默认情况下在```data/data/settled```下)的总和。 如果有多个“ TsFile”目录,例如```{data/data/settled1,data/data/settled2}```,则此统计信息是它们大小的总和 |
+|        类型        | File size statistics                                         |
+|    时间序列名称    | root.stats.file\_size.SETTLED                                |
+| 重新启动系统后重设 | 否                                                           |
+|        例子        | select SETTLED from root.stats.file\_size.SETTLED            |
+
+- OVERFLOW
+
+|        Name        | OVERFLOW                                                     |
+| :----------------: | :----------------------------------------------------------- |
+|        描述        | 计算所有“乱序数据文件”大小的总和(默认为```data/data/unsequence```下),以字节为单位 |
+|        类型        | File size statistics                                         |
+|    时间序列名称    | root.stats.file\_size.OVERFLOW                               |
+| 重新启动系统后重设 | 否                                                           |
+|        例子        | select OVERFLOW from root.stats.file\_size.OVERFLOW          |
+
+- WAL
+
+|        Name        | WAL                                                          |
+| :----------------: | :----------------------------------------------------------- |
+|        描述        | 计算所有```Write-Ahead-Log file```大小的总和(默认为```data/wal```之下),以字节为单位 |
+|        类型        | File size statistics                                         |
+|    时间序列名称    | root.stats.file\_size.WAL                                    |
+| 重新启动系统后重设 | 否                                                           |
+|        例子        | select WAL from root.stats.file\_size.WAL                    |
+
+- INFO
+
+|        Name        | INFO                                                         |
+| :----------------: | :----------------------------------------------------------- |
+|        描述        | 计算所有```.restore```等文件大小的总和(以```data/system/info```命名),以字节为单位 |
+|        类型        | File size statistics                                         |
+|    时间序列名称    | root.stats.file\_size.INFO                                   |
+| 重新启动系统后重设 | 否                                                           |
+|        例子        | select INFO from root.stats.file\_size.INFO                  |
+
+- SCHEMA
+
+|        Name        | SCHEMA                                                       |
+| :----------------: | :----------------------------------------------------------- |
+|        描述        | 计算所有```metadata file```大小(在```data/system/metadata```下)的总和(以字节为单位) |
+|        类型        | File size statistics                                         |
+|    时间序列名称    | root.stats.file\_size.SCHEMA                                 |
+| 重新启动系统后重设 | No                                                           |
+|        例子        | select SCHEMA from root.stats.file\_size.SCHEMA              |
+
 ## 性能监控
 
+### 介绍
+
 性能监控模块用来监控IOTDB每一个操作的耗时,以便用户更好的了解数据库的整体性能。此模块会统计每一种操作的平均耗时,以及耗时在一定时间区间内(1ms,4ms,16ms,64ms,256ms,1024ms,以上)的操作的比例。输出文件在log_measure.log中。输出样例如下:
 
 <img style="width:100%; max-width:800px; max-height:600px; margin-left:auto; margin-right:auto; display:block;" src="https://user-images.githubusercontent.com/13203019/60937461-14296f80-a303-11e9-9602-a7bed624bfb3.png">
diff --git a/docs/Documentation-CHN/UserGuide/7-Ecosystem Integration/3-Spark TsFile.md b/docs/Documentation-CHN/UserGuide/7-Ecosystem Integration/3-Spark TsFile.md
index ae5dc30..b6c74be 100644
--- a/docs/Documentation-CHN/UserGuide/7-Ecosystem Integration/3-Spark TsFile.md	
+++ b/docs/Documentation-CHN/UserGuide/7-Ecosystem Integration/3-Spark TsFile.md	
@@ -7,9 +7,9 @@
     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
@@ -21,4 +21,325 @@
 
 # 第7章: 生态集成
 # TsFile的Spark连接器
-Coming Soon.
\ No newline at end of file
+
+## 1. About TsFile-Spark-Connector
+
+TsFile-Spark-Connector对Tsfile类型的外部数据源实现Spark的支持。 这使用户可以通过Spark读取,写入和查询Tsfile。
+
+使用此连接器,您可以
+
+- 从本地文件系统或hdfs加载单个TsFile到Spark
+- 将本地文件系统或hdfs中特定目录中的所有文件加载到Spark中
+- 将数据从Spark写入TsFile
+
+## 2. System Requirements
+
+| Spark Version | Scala Version | Java Version | TsFile   |
+| ------------- | ------------- | ------------ | -------- |
+| `2.4.3`       | `2.11.8`      | `1.8`        | `0.10.0` |
+
+> 注意:有关如何下载和使用TsFile的更多信息,请参见以下链接:https://github.com/apache/incubator-iotdb/tree/master/tsfile
+
+## 3. 快速开始
+
+### 本地模式
+
+在本地模式下使用TsFile-Spark-Connector启动Spark:
+
+```
+./<spark-shell-path>  --jars  tsfile-spark-connector.jar,tsfile-0.10.0-jar-with-dependencies.jar
+```
+
+- \<spark-shell-path>是您的spark-shell的真实路径。
+- 多个jar包用逗号分隔,没有任何空格。
+- 有关如何获取TsFile的信息,请参见https://github.com/apache/incubator-iotdb/tree/master/tsfile。
+
+### 分布式模式
+
+在分布式模式下使用TsFile-Spark-Connector启动Spark(即,Spark集群通过spark-shell连接):
+
+```
+. /<spark-shell-path>   --jars  tsfile-spark-connector.jar,tsfile-0.8.0-jar-with-dependencies.jar  --master spark://ip:7077
+```
+
+注意:
+
+- \ <spark-shell-path>是您的spark-shell的真实路径。
+- 多个jar包用逗号分隔,没有任何空格。
+- 有关如何获取TsFile的信息,请参见https://github.com/apache/incubator-iotdb/tree/master/tsfile。
+
+## 4. 数据类型对应
+
+| TsFile数据类型 | SparkSQL数据类型 |
+| -------------- | ---------------- |
+| BOOLEAN        | BooleanType      |
+| INT32          | IntegerType      |
+| INT64          | LongType         |
+| FLOAT          | FloatType        |
+| DOUBLE         | DoubleType       |
+| TEXT           | StringType       |
+
+## 5. 模式推断
+
+显示TsFile的方式取决于架构。 以以下TsFile结构为例:TsFile模式中有三个度量:状态,温度和硬件。 这三种测量的基本信息如下:
+
+<center>
+<table style="text-align:center">
+	<tr><th colspan="2">名称</th><th colspan="2">类型</th><th colspan="2">编码</th></tr>
+	<tr><td colspan="2">状态</td><td colspan="2">Boolean</td><td colspan="2">PLAIN</td></tr>
+	<tr><td colspan="2">温度</td><td colspan="2">Float</td><td colspan="2">RLE</td></tr>
+	<tr><td colspan="2">硬件</td><td colspan="2">Text</td><td colspan="2">PLAIN</td></tr>
+</table>
+</center>
+
+TsFile中的现有数据如下:
+
+<center>
+<table style="text-align:center">
+	<tr><th colspan="4">device:root.ln.wf01.wt01</th><th colspan="4">device:root.ln.wf02.wt02</th></tr>
+	<tr><th colspan="2">status</th><th colspan="2">temperature</th><th colspan="2">hardware</th><th colspan="2">status</th></tr>
+	<tr><th>time</th><th>value</td><th>time</th><th>value</td><th>time</th><th>value</th><th>time</th><th>value</td></tr>
+	<tr><td>1</td><td>True</td><td>1</td><td>2.2</td><td>2</td><td>"aaa"</td><td>1</td><td>True</td></tr>
+	<tr><td>3</td><td>True</td><td>2</td><td>2.2</td><td>4</td><td>"bbb"</td><td>2</td><td>False</td></tr>
+	<tr><td>5</td><td> False </td><td>3</td><td>2.1</td><td>6</td><td>"ccc"</td><td>4</td><td>True</td></tr>
+</table>
+</center>
+
+相应的SparkSQL表如下:
+
+| time | root.ln.wf02.wt02.temperature | root.ln.wf02.wt02.status | root.ln.wf02.wt02.hardware | root.ln.wf01.wt01.temperature | root.ln.wf01.wt01.status | root.ln.wf01.wt01.hardware |
+| ---- | ----------------------------- | ------------------------ | -------------------------- | ----------------------------- | ------------------------ | -------------------------- |
+| 1    | null                          | true                     | null                       | 2.2                           | true                     | null                       |
+| 2    | null                          | false                    | aaa                        | 2.2                           | null                     | null                       |
+| 3    | null                          | null                     | null                       | 2.1                           | true                     | null                       |
+| 4    | null                          | true                     | bbb                        | null                          | null                     | null                       |
+| 5    | null                          | null                     | null                       | null                          | false                    | null                       |
+| 6    | null                          | null                     | ccc                        | null                          | null                     | null                       |
+
+您还可以使用如下所示的窄表形式:(您可以参阅第6部分,了解如何使用窄表形式)
+
+| time | device_name       | status | hardware | temperature |
+| ---- | ----------------- | ------ | -------- | ----------- |
+| 1    | root.ln.wf02.wt01 | true   | null     | 2.2         |
+| 1    | root.ln.wf02.wt02 | true   | null     | null        |
+| 2    | root.ln.wf02.wt01 | null   | null     | 2.2         |
+| 2    | root.ln.wf02.wt02 | false  | aaa      | null        |
+| 3    | root.ln.wf02.wt01 | true   | null     | 2.1         |
+| 4    | root.ln.wf02.wt02 | true   | bbb      | null        |
+| 5    | root.ln.wf02.wt01 | false  | null     | null        |
+| 6    | root.ln.wf02.wt02 | null   | ccc      | null        |
+
+
+
+## 6. Scala API
+
+注意:请记住预先分配必要的读写权限。
+
+### 示例1:从本地文件系统读取
+
+```scala
+import org.apache.iotdb.tsfile._
+val wide_df = spark.read.tsfile("test.tsfile")  
+wide_df.show
+
+val narrow_df = spark.read.tsfile("test.tsfile", true)  
+narrow_df.show
+```
+
+### 示例2:从hadoop文件系统读取
+
+```scala
+import org.apache.iotdb.tsfile._
+val wide_df = spark.read.tsfile("hdfs://localhost:9000/test.tsfile") 
+wide_df.show
+
+val narrow_df = spark.read.tsfile("hdfs://localhost:9000/test.tsfile", true)  
+narrow_df.show
+```
+
+### 示例3:从特定目录读取
+
+```scala
+import org.apache.iotdb.tsfile._
+val df = spark.read.tsfile("hdfs://localhost:9000/usr/hadoop") 
+df.show
+```
+
+注1:现在不支持目录中所有TsFile的全局时间排序。
+
+注2:具有相同名称的度量应具有相同的架构。
+
+### 示例4:广泛形式的查询
+
+```scala
+import org.apache.iotdb.tsfile._
+val df = spark.read.tsfile("hdfs://localhost:9000/test.tsfile") 
+df.createOrReplaceTempView("tsfile_table")
+val newDf = spark.sql("select * from tsfile_table where `device_1.sensor_1`>0 and `device_1.sensor_2` < 22")
+newDf.show
+```
+
+```scala
+import org.apache.iotdb.tsfile._
+val df = spark.read.tsfile("hdfs://localhost:9000/test.tsfile") 
+df.createOrReplaceTempView("tsfile_table")
+val newDf = spark.sql("select count(*) from tsfile_table")
+newDf.show
+```
+
+### 示例5:缩小形式的查询
+
+```scala
+import org.apache.iotdb.tsfile._
+val df = spark.read.tsfile("hdfs://localhost:9000/test.tsfile", true) 
+df.createOrReplaceTempView("tsfile_table")
+val newDf = spark.sql("select * from tsfile_table where device_name = 'root.ln.wf02.wt02' and temperature > 5")
+newDf.show
+```
+
+```scala
+import org.apache.iotdb.tsfile._
+val df = spark.read.tsfile("hdfs://localhost:9000/test.tsfile", true) 
+df.createOrReplaceTempView("tsfile_table")
+val newDf = spark.sql("select count(*) from tsfile_table")
+newDf.show
+```
+
+### 例6:写宽格式
+
+```scala
+// we only support wide_form table to write
+import org.apache.iotdb.tsfile._
+
+val df = spark.read.tsfile("hdfs://localhost:9000/test.tsfile") 
+df.show
+df.write.tsfile("hdfs://localhost:9000/output")
+
+val newDf = spark.read.tsfile("hdfs://localhost:9000/output")
+newDf.show
+```
+
+## 例6:写窄格式
+
+```scala
+// we only support wide_form table to write
+import org.apache.iotdb.tsfile._
+
+val df = spark.read.tsfile("hdfs://localhost:9000/test.tsfile", true) 
+df.show
+df.write.tsfile("hdfs://localhost:9000/output", true)
+
+val newDf = spark.read.tsfile("hdfs://localhost:9000/output", true)
+newDf.show
+```
+
+## 附录A:模式推断的旧设计
+
+显示TsFile的方式与TsFile Schema有关。 以以下TsFile结构为例:TsFile架构中有三个度量:状态,温度和硬件。 这三个度量的基本信息如下:
+
+<center>
+<table style="text-align:center">
+	<tr><th colspan="2">名称</th><th colspan="2">类型</th><th colspan="2">编码</th></tr>
+	<tr><td colspan="2">状态</td><td colspan="2">Boolean</td><td colspan="2">PLAIN</td></tr>
+	<tr><td colspan="2">温度</td><td colspan="2">Float</td><td colspan="2">RLE</td></tr>
+	<tr><td colspan="2">硬件</td><td colspan="2">Text</td><td colspan="2">PLAIN</td></tr>
+</table>
+<span>测量的基本信息</span>
+</center>
+
+文件中的现有数据如下:
+
+<center>
+<table style="text-align:center">
+	<tr><th colspan="4">delta\_object:root.ln.wf01.wt01</th><th colspan="4">delta\_object:root.ln.wf02.wt02</th><th colspan="4">delta\_object:root.sgcc.wf03.wt01</th></tr>
+	<tr><th colspan="2">status</th><th colspan="2">temperature</th><th colspan="2">hardware</th><th colspan="2">status</th><th colspan="2">status</th><th colspan="2">temperature</th></tr>
+	<tr><th>time</th><th>value</td><th>time</th><th>value</td><th>time</th><th>value</th><th>time</th><th>value</td><th>time</th><th>value</td><th>time</th><th>value</th></tr>
+	<tr><td>1</td><td>True</td><td>1</td><td>2.2</td><td>2</td><td>"aaa"</td><td>1</td><td>True</td><td>2</td><td>True</td><td>3</td><td>3.3</td></tr>
+	<tr><td>3</td><td>True</td><td>2</td><td>2.2</td><td>4</td><td>"bbb"</td><td>2</td><td>False</td><td>3</td><td>True</td><td>6</td><td>6.6</td></tr>
+	<tr><td>5</td><td> False </td><td>3</td><td>2.1</td><td>6</td><td>"ccc"</td><td>4</td><td>True</td><td>4</td><td>True</td><td>8</td><td>8.8</td></tr>
+	<tr><td>7</td><td> True </td><td>4</td><td>2.0</td><td>8</td><td>"ddd"</td><td>5</td><td>False</td><td>6</td><td>True</td><td>9</td><td>9.9</td></tr>
+</table>
+<span>一组时间序列数据</span>
+</center>
+
+有两种显示方法:
+
+#### 默认方式
+
+将创建两列来存储设备的完整路径:time(LongType)和delta_object(StringType)。
+
+- `time`:时间戳记,LongType
+- `delta_object`:Delta_object ID,StringType
+
+接下来,为每个度量创建一列以存储特定数据。 SparkSQL表结构如下:
+
+<center>
+	<table style="text-align:center">
+	<tr><th>time(LongType)</th><th> delta\_object(StringType)</th><th>status(BooleanType)</th><th>temperature(FloatType)</th><th>hardware(StringType)</th></tr>
+	<tr><td>1</td><td> root.ln.wf01.wt01 </td><td>True</td><td>2.2</td><td>null</td></tr>
+	<tr><td>1</td><td> root.ln.wf02.wt02 </td><td>True</td><td>null</td><td>null</td></tr>
+	<tr><td>2</td><td> root.ln.wf01.wt01 </td><td>null</td><td>2.2</td><td>null</td></tr>
+	<tr><td>2</td><td> root.ln.wf02.wt02 </td><td>False</td><td>null</td><td>"aaa"</td></tr>
+	<tr><td>2</td><td> root.sgcc.wf03.wt01 </td><td>True</td><td>null</td><td>null</td></tr>
+	<tr><td>3</td><td> root.ln.wf01.wt01 </td><td>True</td><td>2.1</td><td>null</td></tr>
+	<tr><td>3</td><td> root.sgcc.wf03.wt01 </td><td>True</td><td>3.3</td><td>null</td></tr>
+	<tr><td>4</td><td> root.ln.wf01.wt01 </td><td>null</td><td>2.0</td><td>null</td></tr>
+	<tr><td>4</td><td> root.ln.wf02.wt02 </td><td>True</td><td>null</td><td>"bbb"</td></tr>
+	<tr><td>4</td><td> root.sgcc.wf03.wt01 </td><td>True</td><td>null</td><td>null</td></tr>
+	<tr><td>5</td><td> root.ln.wf01.wt01 </td><td>False</td><td>null</td><td>null</td></tr>
+	<tr><td>5</td><td> root.ln.wf02.wt02 </td><td>False</td><td>null</td><td>null</td></tr>
+	<tr><td>5</td><td> root.sgcc.wf03.wt01 </td><td>True</td><td>null</td><td>null</td></tr>
+	<tr><td>6</td><td> root.ln.wf02.wt02 </td><td>null</td><td>null</td><td>"ccc"</td></tr>
+	<tr><td>6</td><td> root.sgcc.wf03.wt01 </td><td>null</td><td>6.6</td><td>null</td></tr>
+	<tr><td>7</td><td> root.ln.wf01.wt01 </td><td>True</td><td>null</td><td>null</td></tr>
+	<tr><td>8</td><td> root.ln.wf02.wt02 </td><td>null</td><td>null</td><td>"ddd"</td></tr>
+	<tr><td>8</td><td> root.sgcc.wf03.wt01 </td><td>null</td><td>8.8</td><td>null</td></tr>
+	<tr><td>9</td><td> root.sgcc.wf03.wt01 </td><td>null</td><td>9.9</td><td>null</td></tr>
+	</table>
+</center>
+
+
+
+#### 展开delta_object列
+
+通过“。”将设备列展开为多个列,忽略根目录“root”。方便进行更丰富的聚合操作。如果用户想使用这种显示方式,需要在表创建语句中设置参数“delta\_object\_name”(参考本手册5.1节中的示例5),在本例中,将参数“delta\_object\_name”设置为“root.device.turbine”。路径层的数量必须是一对一的。此时,除了“根”层之外,为设备路径的每一层创建一列。列名是参数中的名称,值是设备相应层的名称。接下来,将为每个度量创建一个列来存储特定的数据。
+
+
+
+那么SparkSQL表结构如下:
+
+<center>
+	<table style="text-align:center">
+	<tr><th>time(LongType)</th><th> group(StringType)</th><th> field(StringType)</th><th> device(StringType)</th><th>status(BooleanType)</th><th>temperature(FloatType)</th><th>hardware(StringType)</th></tr>
+	<tr><td>1</td><td> ln </td><td> wf01 </td><td> wt01 </td><td>True</td><td>2.2</td><td>null</td></tr>
+	<tr><td>1</td><td> ln </td><td> wf02 </td><td> wt02 </td><td>True</td><td>null</td><td>null</td></tr>
+	<tr><td>2</td><td> ln </td><td> wf01 </td><td> wt01 </td><td>null</td><td>2.2</td><td>null</td></tr>
+	<tr><td>2</td><td> ln </td><td> wf02 </td><td> wt02 </td><td>False</td><td>null</td><td>"aaa"</td></tr>
+	<tr><td>2</td><td> sgcc </td><td> wf03 </td><td> wt01 </td><td>True</td><td>null</td><td>null</td></tr>
+	<tr><td>3</td><td> ln </td><td> wf01 </td><td> wt01 </td><td>True</td><td>2.1</td><td>null</td></tr>
+	<tr><td>3</td><td> sgcc </td><td> wf03 </td><td> wt01 </td><td>True</td><td>3.3</td><td>null</td></tr>
+	<tr><td>4</td><td> ln </td><td> wf01 </td><td> wt01 </td><td>null</td><td>2.0</td><td>null</td></tr>
+	<tr><td>4</td><td> ln </td><td> wf02 </td><td> wt02 </td><td>True</td><td>null</td><td>"bbb"</td></tr>
+	<tr><td>4</td><td> sgcc </td><td> wf03 </td><td> wt01 </td><td>True</td><td>null</td><td>null</td></tr>
+	<tr><td>5</td><td> ln </td><td> wf01 </td><td> wt01 </td><td>False</td><td>null</td><td>null</td></tr>
+	<tr><td>5</td><td> ln </td><td> wf02 </td><td> wt02 </td><td>False</td><td>null</td><td>null</td></tr>
+	<tr><td>5</td><td> sgcc </td><td> wf03 </td><td> wt01 </td><td>True</td><td>null</td><td>null</td></tr>
+	<tr><td>6</td><td> ln </td><td> wf02 </td><td> wt02 </td><td>null</td><td>null</td><td>"ccc"</td></tr>
+	<tr><td>6</td><td> sgcc </td><td> wf03 </td><td> wt01 </td><td>null</td><td>6.6</td><td>null</td></tr>
+	<tr><td>7</td><td> ln </td><td> wf01 </td><td> wt01 </td><td>True</td><td>null</td><td>null</td></tr>
+	<tr><td>8</td><td> ln </td><td> wf02 </td><td> wt02 </td><td>null</td><td>null</td><td>"ddd"</td></tr>
+	<tr><td>8</td><td> sgcc </td><td> wf03 </td><td> wt01 </td><td>null</td><td>8.8</td><td>null</td></tr>
+	<tr><td>9</td><td> sgcc </td><td> wf03 </td><td> wt01 </td><td>null</td><td>9.9</td><td>null</td></tr>
+	</table>
+
+</center>
+
+TsFile-Spark-Connector可以通过SparkSQL在SparkSQL中以表的形式显示一个或多个tsfile。它还允许用户指定一个目录或使用通配符来匹配多个目录。如果有多个tsfile,那么所有tsfile中的度量值的并集将保留在表中,并且具有相同名称的度量值在默认情况下具有相同的数据类型。注意,如果存在名称相同但数据类型不同的情况,TsFile-Spark-Connector将不能保证结果的正确性。
+
+
+
+写入过程是将数据aframe写入一个或多个tsfile。默认情况下,需要包含两个列:time和delta_object。其余的列用作测量。如果用户希望将第二个表结构写回TsFile,可以设置“delta\_object\_name”参数(请参阅本手册5.1节的5.1节)。
+
+## 附录B:旧注
+
+注意:检查Spark根目录中的jar软件包,并将libthrift-0.9.2.jar和libfb303-0.9.2.jar分别替换为libthrift-0.9.1.jar和libfb303-0.9.1.jar。
\ No newline at end of file
diff --git a/docs/Documentation-CHN/UserGuide/7-Ecosystem Integration/4-Spark IoTDB.md b/docs/Documentation-CHN/UserGuide/7-Ecosystem Integration/4-Spark IoTDB.md
index 0f0719e..2d2b845 100644
--- a/docs/Documentation-CHN/UserGuide/7-Ecosystem Integration/4-Spark IoTDB.md	
+++ b/docs/Documentation-CHN/UserGuide/7-Ecosystem Integration/4-Spark IoTDB.md	
@@ -7,9 +7,9 @@
     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
@@ -18,6 +18,159 @@
     under the License.
 
 -->
+
 # 第7章: 生态集成
 
-Coming Soon.
\ No newline at end of file
+# Spark IoTDB连接器
+
+## 版本
+
+Spark和Java所需的版本如下:
+
+| Spark Version | Scala Version | Java Version | TsFile   |
+| ------------- | ------------- | ------------ | -------- |
+| `2.4.3`       | `2.11`        | `1.8`        | `0.10.0` |
+
+## 安装
+
+mvn clean scala:compile compile install
+
+# 1. Maven依赖
+
+```
+    <dependency>
+      <groupId>org.apache.iotdb</groupId>
+      <artifactId>spark-iotdb-connector</artifactId>
+      <version>0.10.0</version>
+    </dependency>
+```
+
+# 2. Spark-shell用户指南
+
+```
+spark-shell --jars spark-iotdb-connector-0.10.0.jar,iotdb-jdbc-0.10.0-jar-with-dependencies.jar
+
+import org.apache.iotdb.spark.db._
+
+val df = spark.read.format("org.apache.iotdb.spark.db").option("url","jdbc:iotdb://127.0.0.1:6667/").option("sql","select * from root").load
+
+df.printSchema()
+
+df.show()
+```
+
+### 如果要对rdd进行分区,可以执行以下操作
+
+```
+spark-shell --jars spark-iotdb-connector-0.10.0.jar,iotdb-jdbc-0.10.0-jar-with-dependencies.jar
+
+import org.apache.iotdb.spark.db._
+
+val df = spark.read.format("org.apache.iotdb.spark.db").option("url","jdbc:iotdb://127.0.0.1:6667/").option("sql","select * from root").
+                        option("lowerBound", [lower bound of time that you want query(include)]).option("upperBound", [upper bound of time that you want query(include)]).
+                        option("numPartition", [the partition number you want]).load
+
+df.printSchema()
+
+df.show()
+```
+
+# 3. 模式推断
+
+以下TsFile结构为例:TsFile模式中有三个度量:状态,温度和硬件。 这三种测量的基本信息如下:
+
+<center>
+<table style="text-align:center">
+	<tr><th colspan="2">名称</th><th colspan="2">类型</th><th colspan="2">编码</th></tr>
+	<tr><td colspan="2">状态</td><td colspan="2">Boolean</td><td colspan="2">PLAIN</td></tr>
+	<tr><td colspan="2">温度</td><td colspan="2">Float</td><td colspan="2">RLE</td></tr>
+	<tr><td colspan="2">硬件</td><td colspan="2">Text</td><td colspan="2">PLAIN</td></tr>
+</table>
+</center>
+
+TsFile中的现有数据如下:
+
+<center>
+<table style="text-align:center">
+	<tr><th colspan="4">device:root.ln.wf01.wt01</th><th colspan="4">device:root.ln.wf02.wt02</th></tr>
+	<tr><th colspan="2">状态</th><th colspan="2">温度</th><th colspan="2">硬件</th><th colspan="2">状态</th></tr>
+	<tr><th>时间</th><th>值</td><th>时间</th><th>值</td><th>时间</th><th>值</th><th>时间</th><th>值</td></tr>
+	<tr><td>1</td><td>True</td><td>1</td><td>2.2</td><td>2</td><td>"aaa"</td><td>1</td><td>True</td></tr>
+	<tr><td>3</td><td>True</td><td>2</td><td>2.2</td><td>4</td><td>"bbb"</td><td>2</td><td>False</td></tr>
+	<tr><td>5</td><td> False </td><td>3</td><td>2.1</td><td>6</td><td>"ccc"</td><td>4</td><td>True</td></tr>
+</table>
+</center>
+
+宽(默认)表形式如下:
+
+| time | root.ln.wf02.wt02.temperature | root.ln.wf02.wt02.status | root.ln.wf02.wt02.hardware | root.ln.wf01.wt01.temperature | root.ln.wf01.wt01.status | root.ln.wf01.wt01.hardware |
+| ---- | ----------------------------- | ------------------------ | -------------------------- | ----------------------------- | ------------------------ | -------------------------- |
+| 1    | null                          | true                     | null                       | 2.2                           | true                     | null                       |
+| 2    | null                          | false                    | aaa                        | 2.2                           | null                     | null                       |
+| 3    | null                          | null                     | null                       | 2.1                           | true                     | null                       |
+| 4    | null                          | true                     | bbb                        | null                          | null                     | null                       |
+| 5    | null                          | null                     | null                       | null                          | false                    | null                       |
+| 6    | null                          | null                     | ccc                        | null                          | null                     | null                       |
+
+你还可以使用窄表形式,如下所示:(您可以参阅第4部分,了解如何使用窄表形式)
+
+| 时间 | 设备名            | 状态  | 硬件 | 温度 |
+| ---- | ----------------- | ----- | ---- | ---- |
+| 1    | root.ln.wf02.wt01 | true  | null | 2.2  |
+| 1    | root.ln.wf02.wt02 | true  | null | null |
+| 2    | root.ln.wf02.wt01 | null  | null | 2.2  |
+| 2    | root.ln.wf02.wt02 | false | aaa  | null |
+| 3    | root.ln.wf02.wt01 | true  | null | 2.1  |
+| 4    | root.ln.wf02.wt02 | true  | bbb  | null |
+| 5    | root.ln.wf02.wt01 | false | null | null |
+| 6    | root.ln.wf02.wt02 | null  | ccc  | null |
+
+# 4. 在宽和窄表之间转换
+
+## 从宽到窄
+
+```
+import org.apache.iotdb.spark.db._
+
+val wide_df = spark.read.format("org.apache.iotdb.spark.db").option("url", "jdbc:iotdb://127.0.0.1:6667/").option("sql", "select * from root where time < 1100 and time > 1000").load
+val narrow_df = Transformer.toNarrowForm(spark, wide_df)
+```
+
+## 从窄到宽
+
+```
+import org.apache.iotdb.spark.db._
+
+val wide_df = Transformer.toWideForm(spark, narrow_df)
+```
+
+# 5. Java用户指南
+
+```
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
+import org.apache.spark.sql.SparkSession;
+import org.apache.iotdb.spark.db.*
+
+public class Example {
+
+  public static void main(String[] args) {
+    SparkSession spark = SparkSession
+        .builder()
+        .appName("Build a DataFrame from Scratch")
+        .master("local[*]")
+        .getOrCreate();
+
+    Dataset<Row> df = spark.read().format("org.apache.iotdb.spark.db")
+        .option("url","jdbc:iotdb://127.0.0.1:6667/")
+        .option("sql","select * from root").load();
+
+    df.printSchema();
+
+    df.show();
+    
+    Dataset<Row> narrowTable = Transformer.toNarrowForm(spark, df)
+    narrowTable.show()
+  }
+}
+```
\ No newline at end of file
diff --git a/docs/Documentation/UserGuide/0-Get Started/3-Publication.md b/docs/Documentation/UserGuide/0-Get Started/3-Publication.md
index ed2d3f6..6384e56 100644
--- a/docs/Documentation/UserGuide/0-Get Started/3-Publication.md	
+++ b/docs/Documentation/UserGuide/0-Get Started/3-Publication.md	
@@ -7,9 +7,9 @@
     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
@@ -28,3 +28,9 @@ The research papers related are in the following:
 * [PISA: An Index for Aggregating Big Time Series Data](https://dl.acm.org/citation.cfm?id=2983775&dl=ACM&coll=DL), Xiangdong Huang and Jianmin Wang and Raymond K. Wong and Jinrui Zhang and Chen Wang. CIKM 2016.
 * [Matching Consecutive Subpatterns over Streaming Time Series](https://link.springer.com/chapter/10.1007/978-3-319-96893-3_8), Rong Kang and Chen Wang and Peng Wang and Yuting Ding and Jianmin Wang. APWeb/WAIM 2018.
 * [KV-match: A Subsequence Matching Approach Supporting Normalization and Time Warping](https://www.semanticscholar.org/paper/KV-match%3A-A-Subsequence-Matching-Approach-and-Time-Wu-Wang/9ed84cb15b7e5052028fc5b4d667248713ac8592), Jiaye Wu and Peng Wang and Chen Wang and Wei Wang and Jianmin Wang. ICDE 2019.
+
+# Benchmark tools
+
+We also developed Benchmark tools for time series databases 
+
+https://github.com/thulab/iotdb-benchmark
\ No newline at end of file
diff --git a/docs/Documentation/UserGuide/4-Client/3-Programming - JDBC.md b/docs/Documentation/UserGuide/4-Client/3-Programming - JDBC.md
index 9114020..b56996f 100644
--- a/docs/Documentation/UserGuide/4-Client/3-Programming - JDBC.md	
+++ b/docs/Documentation/UserGuide/4-Client/3-Programming - JDBC.md	
@@ -7,9 +7,9 @@
     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
@@ -29,6 +29,14 @@
 * JDK >= 1.8
 * Maven >= 3.1
 
+## Package only JDBC projects
+
+Execute the following command in the root directory:
+
+```
+mvn clean package -pl jdbc -am -DskipTests
+```
+
 ## How to install in local maven repository
 
 In root directory:
@@ -264,4 +272,4 @@ Here is a list of Status Code and related message:
 |603|UNINITIALIZED_AUTH_ERROR|Uninitialized authorizer|
 
 > All exceptions are refactored in latest version by extracting uniform message into exception classes. Different error codes are added to all exceptions. When an exception is caught and a higher-level exception is thrown, the error code will keep and pass so that users will know the detailed error reason.
-A base exception class "ProcessException" is also added to be extended by all exceptions.
\ No newline at end of file
+A base exception class "ProcessException" is also added to be extended by all exceptions.