数据导入导出脚本

IoTDB 提供了数据导入导出脚本(tools/export-data、tools/import-data,V1.3.2 及之后版本支持;历史版本可使用 tools/export-csv、tools/import-csv 脚本,使用参考文档),用于实现 IoTDB 内部数据与外部文件的交互,适用于单个文件或目录文件批量操作。

支持的数据格式

  • CSV:纯文本格式,存储格式化数据,需按照下文指定 CSV 格式进行构造
  • SQL:包含自定义 SQL 语句的文件

export-data 脚本(数据导出)

运行命令

1. # Unix/OS X
2. >tools/export-data.sh  -h <ip> -p <port> -u <username> -pw <password> -t <directory> [-tf <time-format> -datatype <true/false> -q <query command> -s <source sql file> -tfn <target file name> -lpf <int> -type <export type> -aligned <true/false>]

4. # Windows
5. >tools\export-data.bat -h <ip> -p <port> -u <username> -pw <password> -t <directory> [-tf <time-format> -datatype <true/false> -q <query command> -s <source sql file> -tfn <target file name> -lpf <int> -type <export type> -aligned <true/false>]

参数介绍:

参数 定义 是否必填 默认
-h 数据库IP地址 否 127.0.0.1
-p 数据库端口 否 6667
-u 数据库连接用户名 否 root
-pw 数据库连接密码 否 root
-t 导出的 CSV 或 SQL 文件的输出路径(V1.3.2版本参数是-td) 是
-datatype 是否在 CSV 文件的 header 中时间序列的后面打印出对应的数据类型,选项为 true 或者 false 否 true
-q 在命令中直接指定想要执行的查询语句(目前仅支持部分语句,详细明细见下表) 说明:-q 与 -s 参数必填其一,同时填写则 -q 生效。详细支持的 SQL 语句示例,请参考下方“SQL语句支持明细” 否
-s 指定 SQL 文件,该文件可包含一条或多条 SQL 语句。如果包含多条 SQL 语句,语句之间应该用换行(回车)进行分割。每一条 SQL 语句对应一个或多个输出的CSV或 SQL 文件 说明:-q 与 -s 参数必填其一,同时填写则-q生效。详细支持的 SQL 语句示例,请参考下方“SQL语句支持规则” 否
-type 指定导出的文件类型,选项为 csv 或者 sql 否 csv
-tf 指定时间格式。时间格式必须遵守ISO 8601标准,或时间戳(timestamp) 说明:只在 -type 为 csv 时生效 否 yyyy-MM-dd HH:mm:ss.SSSz
-lpf 指定导出的 dump 文件最大行数(V1.3.2版本参数是-linesPerFile) 否 10000
-timeout 指定 session 查询时的超时时间,单位为ms 否 -1

SQL 语句支持规则:

  1. 只支持查询语句,非查询语句(如:元数据管理、系统管理等语句)不支持。对于不支持的 SQL ,程序会自动跳过,同时输出错误信息。
  2. 查询语句中目前版本仅支持原始数据的导出,如果有使用 group by、聚合函数、udf、操作运算符等则不支持导出为 SQL。原始数据导出时请注意,若导出多个设备数据,请使用 align by device 语句。详细示例如下:
支持导出 示例
原始数据单设备查询 支持 select from root.s_0.d_0
原始数据多设备查询(aligin by device) 支持 select from root. align by device
原始数据多设备查询(无 aligin by device) 不支持 select * from root. select from root.s_0.

运行示例

  • 导出某 SQL 执行范围下的所有数据至 CSV 文件。

1. # Unix/OS X 2. >tools/export-data.sh -t ./data/ -q 'select * from root.stock.**' 3. # Windows 4. >tools/export-data.bat -t ./data/ -q 'select * from root.stock.**' - 导出结果

1. Time,root.stock.Legacy.0700HK.L1_BidPrice,root.stock.Legacy.0700HK.Type,root.stock.Legacy.0700HK.L1_BidSize,root.stock.Legacy.0700HK.Domain,root.stock.Legacy.0700HK.L1_BuyNo,root.stock.Legacy.0700HK.L1_AskPrice 2. 2024-07-29T18:37:18.700+08:00,0.9666617,3.0,0.021367407654674264,-6.0,false,0.8926191 3. 2024-07-29T18:37:19.701+08:00,0.3057328,3.0,0.9965377284981661,-5.0,false,0.15167356 - 导出 SQL 文件内所有 SQL 执行范围下的所有数据至 CSV 文件。

1. # Unix/OS X 2. >tools/export-data.sh -t ./data/ -s export.sql 3. # Windows 4. >tools/export-data.bat -t ./data/ -s export.sql - export.sql 文件内容(-s 参数指向的文件)

1. select * from root.stock.** limit 100 2. select * from root.db.** limit 100 - 导出结果文件1

1. Time,root.stock.Legacy.0700HK.L1_BidPrice,root.stock.Legacy.0700HK.Type,root.stock.Legacy.0700HK.L1_BidSize,root.stock.Legacy.0700HK.Domain,root.stock.Legacy.0700HK.L1_BuyNo,root.stock.Legacy.0700HK.L1_AskPrice 2. 2024-07-29T18:37:18.700+08:00,0.9666617,3.0,0.021367407654674264,-6.0,false,0.8926191 3. 2024-07-29T18:37:19.701+08:00,0.3057328,3.0,0.9965377284981661,-5.0,false,0.15167356 - 导出结果文件2

1. Time,root.db.Random.RandomBoolean 2. 2024-07-22T17:16:05.820+08:00,true 3. 2024-07-22T17:16:02.597+08:00,false - 将 IoTDB 数据库中在 SQL 文件内定义的数据,以对齐的格式将其导出为 SQL 语句。

1. # Unix/OS X 2. >tools/export-data.sh -h 127.0.0.1 -p 6667 -u root -p root -t ./data/ -s export.sql -type sql -aligned true 3. # Windows 4. >tools/export-data.bat -h 127.0.0.1 -p 6667 -u root -p root -t ./data/ -s export.sql -type sql -aligned true - 导出结果

1. INSERT INTO root.stock.Legacy.0700HK(TIMESTAMP,L1_BidPrice,Type,L1_BidSize,Domain,L1_BuyNo,L1_AskPrice) ALIGNED VALUES (1722249629831,0.62308747,2.0,0.012206747854849653,-6.0,false,0.14164352); 2. INSERT INTO root.stock.Legacy.0700HK(TIMESTAMP,L1_BidPrice,Type,L1_BidSize,Domain,L1_BuyNo,L1_AskPrice) ALIGNED VALUES (1722249630834,0.7520042,3.0,0.22760657101910464,-5.0,true,0.089064896); 3. INSERT INTO root.stock.Legacy.0700HK(TIMESTAMP,L1_BidPrice,Type,L1_BidSize,Domain,L1_BuyNo,L1_AskPrice) ALIGNED VALUES (1722249631835,0.3981064,3.0,0.6254559288663467,-6.0,false,0.9767922); - 将某 SQL 执行范围下的所有数据导出至 CSV 文件,指定导出的时间格式为yyyy-MM-dd HH:mm:ss,且表头时间序列的后面打印出对应的数据类型。

1. # Unix/OS X 2. >tools/export-data.sh -t ./data/ -tf 'yyyy-MM-dd HH:mm:ss' -datatype true -q "select * from root.stock.**" -type csv 3. # Windows 4. >tools/export-data.bat -t ./data/ -tf 'yyyy-MM-dd HH:mm:ss' -datatype true -q "select * from root.stock.**" -type csv - 导出结果

1. Time,root.stock.Legacy.0700HK.L1_BidPrice(DOUBLE),root.stock.Legacy.0700HK.Type(DOUBLE),root.stock.Legacy.0700HK.L1_BidSize(DOUBLE),root.stock.Legacy.0700HK.Domain(DOUBLE),root.stock.Legacy.0700HK.L1_BuyNo(BOOLEAN),root.stock.Legacy.0700HK.L1_AskPrice(DOUBLE) 2. 2024-07-30 10:33:55,0.44574088,3.0,0.21476832811611501,-4.0,true,0.5951748 3. 2024-07-30 10:33:56,0.6880933,3.0,0.6289119476165305,-5.0,false,0.114634395

import-data 脚本(数据导入)

导入文件示例

CSV 文件示例

注意,在导入 CSV 数据前,需要特殊处理下列的字符:

  1. 如果 Text 类型的字段中包含特殊字符如,需要使用\来进行转义。
  2. 可以导入像yyyy-MM-dd'T'HH:mm:ss, yyy-MM-dd HH:mm:ss, 或者 yyyy-MM-dd'T'HH:mm:ss.SSSZ格式的时间。
  3. 时间列Time应该始终放在第一列。

示例一:时间对齐,并且 header 中不包含数据类型的数据。

1. Time,root.test.t1.str,root.test.t2.str,root.test.t2.var
2. 1970-01-01T08:00:00.001+08:00,"123hello world","123\,abc",100
3. 1970-01-01T08:00:00.002+08:00,"123",,

示例二:时间对齐,并且 header 中包含数据类型的数据(Text 类型数据支持加双引号和不加双引号)

1. Time,root.test.t1.str(TEXT),root.test.t2.str(TEXT),root.test.t2.var(INT32)
2. 1970-01-01T08:00:00.001+08:00,"123hello world","123\,abc",100
3. 1970-01-01T08:00:00.002+08:00,123,hello world,123
4. 1970-01-01T08:00:00.003+08:00,"123",,
5. 1970-01-01T08:00:00.004+08:00,123,,12

示例三:设备对齐,并且 header 中不包含数据类型的数据

1. Time,Device,str,var
2. 1970-01-01T08:00:00.001+08:00,root.test.t1,"123hello world",
3. 1970-01-01T08:00:00.002+08:00,root.test.t1,"123",
4. 1970-01-01T08:00:00.001+08:00,root.test.t2,"123\,abc",100

示例四:设备对齐,并且 header 中包含数据类型的数据(Text 类型数据支持加双引号和不加双引号)

1. Time,Device,str(TEXT),var(INT32)
2. 1970-01-01T08:00:00.001+08:00,root.test.t1,"123hello world",
3. 1970-01-01T08:00:00.002+08:00,root.test.t1,"123",
4. 1970-01-01T08:00:00.001+08:00,root.test.t2,"123\,abc",100
5. 1970-01-01T08:00:00.002+08:00,root.test.t1,hello world,123

SQL 文件示例

对于不支持的 SQL ,不合法的 SQL ,执行失败的 SQL 都会放到失败目录下的失败文件里(默认为 文件名.failed)

1. INSERT INTO root.stock.Legacy.0700HK(TIMESTAMP,L1_BidPrice,Type,L1_BidSize,Domain,L1_BuyNo,L1_AskPrice) VALUES (1721728578812,0.21911979,4.0,0.7129878488375604,-5.0,false,0.65362453);
2. INSERT INTO root.stock.Legacy.0700HK(TIMESTAMP,L1_BidPrice,Type,L1_BidSize,Domain,L1_BuyNo,L1_AskPrice) VALUES (1721728579812,0.35814416,3.0,0.04674720094979623,-5.0,false,0.9365247);
3. INSERT INTO root.stock.Legacy.0700HK(TIMESTAMP,L1_BidPrice,Type,L1_BidSize,Domain,L1_BuyNo,L1_AskPrice) VALUES (1721728580813,0.20012152,3.0,0.9910098187911393,-4.0,true,0.70040536);
4. INSERT INTO root.stock.Legacy.0700HK(TIMESTAMP,L1_BidPrice,Type,L1_BidSize,Domain,L1_BuyNo,L1_AskPrice) VALUES (1721728581814,0.034122765,4.0,0.9313345284181858,-4.0,true,0.9945297);

运行命令

1. # Unix/OS X
2. >tools/import-data.sh -h <ip> -p <port> -u <username> -pw <password> -s <xxx.csv/sql> [-fd <./failedDirectory> -aligned <true/false> -batch <int> -tp <ms/ns/us> -typeInfer <boolean=text,float=double...> -lpf <int>]

4. # Windows
5. >tools\import-data.bat -h <ip> -p <port> -u <username> -pw <password> -s <xxx.csv/sql> [-fd <./failedDirectory> -aligned <true/false> -batch <int> -tp <ms/ns/us> -typeInfer <boolean=text,float=double...> -lpf <int>]

虽然 IoTDB 具有类型推断的能力,但我们仍然推荐在导入数据前创建元数据,因为这可以避免不必要的类型转换错误。如下:

1. CREATE DATABASE root.fit.d1;
2. CREATE DATABASE root.fit.d2;
3. CREATE DATABASE root.fit.p;
4. CREATE TIMESERIES root.fit.d1.s1 WITH DATATYPE=INT32,ENCODING=RLE;
5. CREATE TIMESERIES root.fit.d1.s2 WITH DATATYPE=TEXT,ENCODING=PLAIN;
6. CREATE TIMESERIES root.fit.d2.s1 WITH DATATYPE=INT32,ENCODING=RLE;
7. CREATE TIMESERIES root.fit.d2.s3 WITH DATATYPE=INT32,ENCODING=RLE;
8. CREATE TIMESERIES root.fit.p.s1 WITH DATATYPE=INT32,ENCODING=RLE;

参数介绍:

参数 定义 是否必填 默认
-h 数据库 IP 地址 否 127.0.0.1
-p 数据库端口 否 6667
-u 数据库连接用户名 否 root
-pw 数据库连接密码 否 root
-s 指定想要导入的数据,这里可以指定文件或者文件夹。如果指定的是文件夹,将会把文件夹中所有的后缀为 csv 或者 sql 的文件进行批量导入(V1.3.2版本参数是-f) 是
-fd 指定存放失败 SQL 文件的目录,如果未指定这个参数,失败的文件将会被保存到源数据的目录中。 说明:对于不支持的 SQL ,不合法的 SQL ,执行失败的 SQL 都会放到失败目录下的失败文件里(默认为 文件名.failed) 否 源文件名加上.failed后缀
-aligned 指定是否使用aligned接口,选项为 true 或者 false 说明:这个参数只在导入文件为csv文件时生效 否 false
-batch 用于指定每一批插入的数据的点数(最小值为1,最大值为 Integer.MAX_VALUE)。如果程序报了org.apache.thrift.transport.TTransportException: Frame size larger than protect max size这个错的话,就可以适当的调低这个参数。 否 100000
-tp 指定时间精度,可选值包括ms(毫秒),ns(纳秒),us(微秒) 否 ms
-lpf 指定每个导入失败文件写入数据的行数(V1.3.2版本参数是-linesPerFailedFile) 否 10000
-typeInfer 用于指定类型推断规则,如<srcTsDataType1=dstTsDataType1,srcTsDataType2=dstTsDataType2,…>。 说明:用于指定类型推断规则.srcTsDataType 包括 boolean,int,long,float,double,NaN.dstTsDataType 包括 boolean,int,long,float,double,text.当srcTsDataType为boolean, dstTsDataType只能为boolean或text.当srcTsDataType为NaN, dstTsDataType只能为float, double或text.当srcTsDataType为数值类型, dstTsDataType的精度需要高于srcTsDataType.例如:-typeInfer boolean=text,float=double 否

运行示例

  • 导入当前data目录下的dump0_0.sql数据到本机 IoTDB 数据库中。
1. # Unix/OS X
2. >tools/import-data.sh -s ./data/dump0_0.sql
3. # Windows
4. >tools/import-data.bat -s ./data/dump0_0.sql
  • 将当前data目录下的所有数据以对齐的方式导入到本机 IoTDB 数据库中。
1. # Unix/OS X
2. >tools/import-data.sh -s ./data/ -fd ./failed/ -aligned true
3. # Windows
4. >tools/import-data.bat -s ./data/ -fd ./failed/ -aligned true
  • 导入当前data目录下的dump0_0.csv数据到本机 IoTDB 数据库中。
1. # Unix/OS X
2. >tools/import-data.sh -s ./data/dump0_0.csv -fd ./failed/
3. # Windows
4. >tools/import-data.bat -s ./data/dump0_0.csv -fd ./failed/
  • 将当前data目录下的dump0_0.csv数据以对齐的方式,一批导入100000条导入到192.168.100.1IP所在主机的 IoTDB 数据库中,失败的记录记在当前failed目录下,每个文件最多记1000条。
1. # Unix/OS X
2. >tools/import-data.sh -h 192.168.100.1 -p 6667 -u root -pw root -s ./data/dump0_0.csv -fd ./failed/ -aligned true -batch 100000 -tp ms -typeInfer boolean=text,float=double -lpf 1000
3. # Windows
4. >tools/import-data.bat -h 192.168.100.1 -p 6667 -u root -pw root -s ./data/dump0_0.csv -fd ./failed/ -aligned true -batch 100000 -tp ms -typeInfer boolean=text,float=double -lpf 1000