diff --git a/core/src/main/java/com/alibaba/datax/core/Engine.java b/core/src/main/java/com/alibaba/datax/core/Engine.java
index f80d792f..be21512b 100755
--- a/core/src/main/java/com/alibaba/datax/core/Engine.java
+++ b/core/src/main/java/com/alibaba/datax/core/Engine.java
@@ -73,7 +73,7 @@ public class Engine {
boolean traceEnable = allConf.getBool(CoreConstant.DATAX_CORE_CONTAINER_TRACE_ENABLE, true);
boolean perfReportEnable = allConf.getBool(CoreConstant.DATAX_CORE_REPORT_DATAX_PERFLOG, true);
- //standlone模式的datax shell任务不进行汇报
+ //standalone模式的 datax shell任务不进行汇报
if(instanceId == -1){
perfReportEnable = false;
}
diff --git a/tdenginereader/doc/tdenginereader.md b/tdenginereader/doc/tdenginereader-CN.md
similarity index 55%
rename from tdenginereader/doc/tdenginereader.md
rename to tdenginereader/doc/tdenginereader-CN.md
index 3c683a64..aa3751ef 100644
--- a/tdenginereader/doc/tdenginereader.md
+++ b/tdenginereader/doc/tdenginereader-CN.md
@@ -6,12 +6,14 @@ TDengineReader 插件实现了 TDengine 读取数据的功能。
## 2 实现原理
-TDengineReader 通过TDengine的JDBC driver查询获取数据。
+TDengineReader 通过 TDengine 的 JDBC driver 查询获取数据。
## 3 功能说明
### 3.1 配置样例
+* 配置一个从 TDengine 抽取数据作业:
+
```json
{
"job": {
@@ -27,7 +29,9 @@ TDengineReader 通过TDengine的JDBC driver查询获取数据。
"table": [
"meters"
],
- "jdbcUrl": "jdbc:TAOS-RS://192.168.56.105:6041/test?timestampFormat=TIMESTAMP"
+ "jdbcUrl": [
+ "jdbc:TAOS-RS://192.168.56.105:6041/test?timestampFormat=TIMESTAMP"
+ ]
}
],
"column": [
@@ -36,9 +40,51 @@ TDengineReader 通过TDengine的JDBC driver查询获取数据。
"voltage",
"phase"
],
+ "where": "ts>=0",
"beginDateTime": "2017-07-14 10:40:00",
- "endDateTime": "2017-08-14 10:40:00",
- "splitInterval": "1d"
+ "endDateTime": "2017-08-14 10:40:00"
+ }
+ },
+ "writer": {
+ "name": "streamwriter",
+ "parameter": {
+ "encoding": "UTF-8",
+ "print": true
+ }
+ }
+ }
+ ],
+ "setting": {
+ "speed": {
+ "channel": 1
+ }
+ }
+ }
+}
+```
+
+* 配置一个自定义 SQL 的数据抽取作业:
+
+```json
+{
+ "job": {
+ "content": [
+ {
+ "reader": {
+ "name": "tdenginereader",
+ "parameter": {
+ "user": "root",
+ "password": "taosdata",
+ "connection": [
+ {
+ "querySql": [
+ "select * from test.meters"
+ ],
+ "jdbcUrl": [
+ "jdbc:TAOS-RS://192.168.56.105:6041/test?timestampFormat=TIMESTAMP"
+ ]
+ }
+ ]
}
},
"writer": {
@@ -62,37 +108,44 @@ TDengineReader 通过TDengine的JDBC driver查询获取数据。
### 3.2 参数说明
* **username**
- * 描述:TDengine实例的用户名
+ * 描述:TDengine 实例的用户名
* 必选:是
* 默认值:无
* **password**
- * 描述:TDengine实例的密码
+ * 描述:TDengine 实例的密码
* 必选:是
* 默认值:无
-* **table**
- * 描述:所选取的需要同步的表。使用JSON的数组描述,因此支持多张表同时抽取。当配置为多张表时,用户自己需保证多张表是同一schema结构,
- TDengineReader不予检查表是否同一逻辑表。注意,table必须包含在connection配置单元中。
- * 必选:是
- * 默认值:无
* **jdbcUrl**
- * 描述:TDengine数据库的JDBC连接信息。注意,jdbcUrl必须包含在connection配置单元中。JdbcUrl具体请参看TDengine官方文档。
+ * 描述:TDengine 数据库的JDBC连接信息。注意,jdbcUrl必须包含在connection配置单元中。JdbcUrl具体请参看TDengine官方文档。
* 必选:是
* 默认值:无
+* **querySql**
+ * 描述:在有些业务场景下,where 这一配置项不足以描述所筛选的条件,用户可以通过该配置型来自定义筛选SQL。当用户配置了 querySql 后, TDengineReader 就会忽略 table, column,
+ where, beginDateTime, endDateTime这些配置型,直接使用这个配置项的内容对数据进行筛选。例如需要 进行多表join后同步数据,使用 select a,b from table_a join
+ table_b on table_a.id = table_b.id
+ * 必选:否
+ * 默认值:无
+* **table**
+ * 描述:所选取的需要同步的表。使用 JSON 的数组描述,因此支持多张表同时抽取。当配置为多张表时,用户自己需保证多张表是同一 schema 结构, TDengineReader不予检查表是否同一逻辑表。注意,table必须包含在
+ connection 配置单元中。
+ * 必选:是
+ * 默认值:无
+* **where**
+ * 描述:筛选条件中的 where 子句,TDengineReader 根据指定的column, table, where, begingDateTime, endDateTime 条件拼接 SQL,并根据这个 SQL
+ 进行数据抽取。
+ * 必选:否
+ * 默认值:无
* **beginDateTime**
- * 描述:数据的开始时间,Job迁移从begineDateTime到endDateTime的数据,格式为yyyy-MM-dd HH:mm:ss
- * 必选:是
+ * 描述:数据的开始时间,Job 迁移从 begineDateTime 到 endDateTime 的数据,格式为 yyyy-MM-dd HH:mm:ss
+ * 必选:否
* 默认值:无
* **endDateTime**
- * 描述:数据的结束时间,Job迁移从begineDateTime到endDateTime的数据,格式为yyyy-MM-dd HH:mm:ss
- * 必选:是
- * 默认值:无
-* **splitInterval**
- * 描述:按照splitInterval来划分task, 每splitInterval创建一个task。例如,20d代表按照每20天的数据划分为1个task。
- 可以配置的时间单位为:d(天), h(小时), m(分钟), s(秒)
- * 必选:是
+ * 描述:数据的结束时间,Job 迁移从 begineDateTime 到 endDateTime 的数据,格式为 yyyy-MM-dd HH:mm:ss
+ * 必选:否
* 默认值:无
### 3.3 类型转换
+
| TDengine 数据类型 | DataX 内部类型 |
| --------------- | ------------- |
| TINYINT | Long |
@@ -106,7 +159,6 @@ TDengineReader 通过TDengine的JDBC driver查询获取数据。
| BINARY | Bytes |
| NCHAR | String |
-
## 4 性能报告
### 4.1 环境准备
diff --git a/tdenginereader/pom.xml b/tdenginereader/pom.xml
index ca444bce..319152f8 100644
--- a/tdenginereader/pom.xml
+++ b/tdenginereader/pom.xml
@@ -29,10 +29,29 @@
+
+ com.alibaba
+ fastjson
+ 1.2.78
+
+
+
+ com.alibaba.datax.tdenginewriter
+ tdenginewriter
+ 0.0.1-SNAPSHOT
+ compile
+
+
com.taosdata.jdbc
taos-jdbcdriver
2.0.37
+
+
+ com.alibaba
+ fastjson
+
+
@@ -47,6 +66,21 @@
0.0.1-SNAPSHOT
compile
+
+
+ com.alibaba.datax
+ datax-core
+ 0.0.1-SNAPSHOT
+ test
+
+
+
+
+
+
+
+
+
diff --git a/tdenginereader/src/main/java/com/alibaba/datax/plugin/reader/Key.java b/tdenginereader/src/main/java/com/alibaba/datax/plugin/reader/Key.java
deleted file mode 100644
index 95b55386..00000000
--- a/tdenginereader/src/main/java/com/alibaba/datax/plugin/reader/Key.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.alibaba.datax.plugin.reader;
-
-public class Key {
-
- public static final String JDBC_URL = "jdbcUrl";
-// public static final String HOST = "host";
-// public static final String PORT = "port";
-// public static final String DB = "db";
- public static final String TABLE = "table";
- public static final String USER = "username";
- public static final String PASSWORD = "password";
- public static final String CONNECTION = "connection";
-// public static final String SQL = "sql";
- public static final String BEGIN_DATETIME = "beginDateTime";
- public static final String END_DATETIME = "endDateTime";
- public static final String SPLIT_INTERVAL = "splitInterval";
- public static final String COLUMN = "column";
- public static final String MANDATORY_ENCODING = "mandatoryEncoding";
-}
diff --git a/tdenginereader/src/main/java/com/alibaba/datax/plugin/reader/TDengineReader.java b/tdenginereader/src/main/java/com/alibaba/datax/plugin/reader/TDengineReader.java
index f00d879f..332ddf3a 100644
--- a/tdenginereader/src/main/java/com/alibaba/datax/plugin/reader/TDengineReader.java
+++ b/tdenginereader/src/main/java/com/alibaba/datax/plugin/reader/TDengineReader.java
@@ -1,13 +1,11 @@
package com.alibaba.datax.plugin.reader;
-import com.alibaba.datax.common.constant.CommonConstant;
import com.alibaba.datax.common.element.*;
import com.alibaba.datax.common.exception.DataXException;
import com.alibaba.datax.common.plugin.RecordSender;
import com.alibaba.datax.common.spi.Reader;
import com.alibaba.datax.common.util.Configuration;
-import com.alibaba.datax.plugin.rdbms.util.DataBaseType;
-import com.alibaba.fastjson.JSON;
+import com.alibaba.datax.plugin.writer.tdenginewriter.Key;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -17,89 +15,86 @@ import java.sql.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
public class TDengineReader extends Reader {
+
private static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static class Job extends Reader.Job {
-
private static final Logger LOG = LoggerFactory.getLogger(Job.class);
private Configuration originalConfig;
@Override
public void init() {
this.originalConfig = super.getPluginJobConf();
- // check user
- String user = this.originalConfig.getString(Key.USER);
- if (StringUtils.isBlank(user))
- throw DataXException.asDataXException(TDengineReaderErrorCode.REQUIRED_VALUE, "The parameter [" + Key.USER + "] is not set.");
+ // check username
+ String username = this.originalConfig.getString(Key.USERNAME);
+ if (StringUtils.isBlank(username))
+ throw DataXException.asDataXException(TDengineReaderErrorCode.REQUIRED_VALUE,
+ "The parameter [" + Key.USERNAME + "] is not set.");
// check password
String password = this.originalConfig.getString(Key.PASSWORD);
if (StringUtils.isBlank(password))
- throw DataXException.asDataXException(TDengineReaderErrorCode.REQUIRED_VALUE, "The parameter [" + Key.PASSWORD + "] is not set.");
+ throw DataXException.asDataXException(TDengineReaderErrorCode.REQUIRED_VALUE,
+ "The parameter [" + Key.PASSWORD + "] is not set.");
+
+ // check connection
+ List connectionList = this.originalConfig.getListConfiguration(Key.CONNECTION);
+ if (connectionList == null || connectionList.isEmpty())
+ throw DataXException.asDataXException(TDengineReaderErrorCode.REQUIRED_VALUE,
+ "The parameter [" + Key.CONNECTION + "] is not set.");
+ for (int i = 0; i < connectionList.size(); i++) {
+ Configuration conn = connectionList.get(i);
+ // check jdbcUrl
+ List