数据导入

1. IoTDB 数据导入

IoTDB 目前支持将 CSV、SQL、及TsFile(IoTDB底层开放式时间序列文件格式)格式的数据导入数据库。具体功能如下:

文件格式 IoTDB工具 具体介绍
CSV import-data.sh/bat 可用于单个或一个目录的 CSV 文件批量导入 IoTDB
SQL import-data.sh/bat 可用于单个或一个目录的 SQL 文件批量导入 IoTDB
TsFile load-tsfile.sh/bat 可用于单个或一个目录的 TsFile 文件批量导入 IoTDB
TsFile 主动监听&加载功能 根据用户配置,监听指定路径下TsFile文件的变化,将新增加的TsFile文件加载入IoTDB

2. import-data 脚本

  • 支持格式:CSV、SQL

2.1 运行命令:

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>]

2.2 参数介绍:

参数 定义 是否必填 默认
-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 否

2.3 运行示例:

  • 导入当前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

2.4 导入说明

  1. CSV 导入规范

  2. 特殊字符转义规则:若Text类型的字段中包含特殊字符(例如逗号,),需使用反斜杠(\)​进行转义处理。

  3. 支持的时间格式:yyyy-MM-dd’T’HH:mm:ss, yyy-MM-dd HH:mm:ss, 或者 yyyy-MM-dd’T’HH:mm:ss.SSSZ。
  4. 时间戳列​必须作为数据文件的首列存在。

  5. CSV 文件示例

  6. 时间对齐

1. -- header 中不包含数据类型
2. Time,root.test.t1.str,root.test.t2.str,root.test.t2.var
3. 1970-01-01T08:00:00.001+08:00,"123hello world","123\,abc",100
4. 1970-01-01T08:00:00.002+08:00,"123",,

6. -- header 中包含数据类型(Text 类型数据支持加双引号和不加双引号)
7. Time,root.test.t1.str(TEXT),root.test.t2.str(TEXT),root.test.t2.var(INT32)
8. 1970-01-01T08:00:00.001+08:00,"123hello world","123\,abc",100
9. 1970-01-01T08:00:00.002+08:00,123,hello world,123
10. 1970-01-01T08:00:00.003+08:00,"123",,
11. 1970-01-01T08:00:00.004+08:00,123,,12
  • 设备对齐
1. -- header 中不包含数据类型
2. Time,Device,str,var
3. 1970-01-01T08:00:00.001+08:00,root.test.t1,"123hello world",
4. 1970-01-01T08:00:00.002+08:00,root.test.t1,"123",
5. 1970-01-01T08:00:00.001+08:00,root.test.t2,"123\,abc",100

7. -- header 中包含数据类型(Text 类型数据支持加双引号和不加双引号)
8. Time,Device,str(TEXT),var(INT32)
9. 1970-01-01T08:00:00.001+08:00,root.test.t1,"123hello world",
10. 1970-01-01T08:00:00.002+08:00,root.test.t1,"123",
11. 1970-01-01T08:00:00.001+08:00,root.test.t2,"123\,abc",100
12. 1970-01-01T08:00:00.002+08:00,root.test.t1,hello world,123

3. load-tsfile 脚本

  • 支持格式:TsFile

3.1 运行命令

1. # Unix/OS X
2. >tools/load-tsfile.sh -h <ip> -p <port> -u <username> -pw <password> -s <source> -os <on_success> [-sd <success_dir>] -of <on_fail> [-fd <fail_dir>] [-tn <thread_num>]

4. # Windows
5. >tools\load-tsfile.bat -h <ip> -p <port> -u <username> -pw <password>  -s <source> -os <on_success> [-sd <success_dir>] -of <on_fail> [-fd <fail_dir>] [-tn <thread_num>]

3.2 参数介绍

参数 定义 是否必填 默认
-h 主机名 否 root
-p 端口号 否 root
-u 用户名 否 127.0.0.1
-pw 密码 否 6667
-s 待加载的脚本文件(夹)的本地目录路径 是
-os none:不删除 mv:移动成功的文件到目标文件夹 cp:硬连接(拷贝)成功的文件到目标文件夹 delete:删除 是
-sd 当—on_succcess为mv或cp时,mv或cp的目标文件夹。文件的文件名变为文件夹打平后拼接原有文件名 当—on_succcess为mv或cp时需要填写是 ${EXEC_DIR}/success
-of none:跳过 mv:移动失败的文件到目标文件夹 cp:硬连接(拷贝)失败的文件到目标文件夹 delete:删除 是
-fd 当—on_fail指定为mv或cp时,mv或cp的目标文件夹。文件的文件名变为文件夹打平后拼接原有文件名 当—on_fail指定为mv或cp时需要填写 ${EXEC_DIR}/fail
-tn 最大并行线程数 是 8

3.3 运行示例:

1. # Unix/OS X
2. > tools/load-tsfile.sh -h 127.0.0.1 -p 6667 -u root -pw root -s /path/sql -os delete -of delete -tn 8
3. > tools/load-tsfile.sh -h 127.0.0.1 -p 6667 -u root -pw root -s /path/sql -os mv -of cp -sd /path/success/dir -fd /path/failure/dir -tn 8

5. # Windows
6. > tools/load_data.bat -h 127.0.0.1 -p 6667 -u root -pw root -s /path/sql -os mv -of cp -sd /path/success/dir -fd /path/failure/dir -tn 8
7. > tools/load_data.bat -h 127.0.0.1 -p 6667 -u root -pw root -s /path/sql -os delete -of delete -tn 8

4. TsFile 主动监听&加载功能

TsFile 主动监听&加载功能能够主动监听指定目标路径(用户配置)下TsFile的文件变化,并将目标路径下的TsFile文件自动同步至指定接收路径(用户配置)。通过此功能,IoTDB 能自动检测并加载这些文件,无需手动执行任何额外的加载操作。这种自动化流程不仅简化了用户的操作步骤,还减少了操作过程中可能出现的错误,有效降低了用户在使用过程中的复杂性。

数据导入(V1.3.3) - 图1

4.1 配置参数

可通过从配置文件模版 iotdb-system.properties.template 中找到下列参数,添加到 IoTDB 配置文件 iotdb-system.properties 中开启TsFile 主动监听&加载功能。完整配置如下::

配置参数 参数说明 value 取值范围 是否必填 默认值 加载方式
load_active_listening_enable 是否开启 DataNode 主动监听并且加载 tsfile 的功能(默认开启)。 Boolean: true,false 选填 true 热加载
load_active_listening_dirs 需要监听的目录(自动包括目录中的子目录),如有多个使用 “,“ 隔开默认的目录为 ext/load/pending(支持热装载) String: 一个或多个文件目录 选填 ext/load/pending 热加载
load_active_listening_fail_dir 执行加载 tsfile 文件失败后将文件转存的目录,只能配置一个 String: 一个文件目录 选填 ext/load/failed 热加载
load_active_listening_max_thread_num 同时执行加载 tsfile 任务的最大线程数,参数被注释掉时的默值为 max(1, CPU 核心数 / 2),当用户设置的值不在这个区间[1, CPU核心数 /2]内时,会设置为默认值 (1, CPU 核心数 / 2) Long: [1, Long.MAX_VALUE] 选填 max(1, CPU 核心数 / 2) 重启后生效
load_active_listening_check_interval_seconds 主动监听轮询间隔,单位秒。主动监听 tsfile 的功能是通过轮询检查文件夹实现的。该配置指定了两次检查 load_active_listening_dirs 的时间间隔,每次检查完成 load_active_listening_check_interval_seconds 秒后,会执行下一次检查。当用户设置的轮询间隔小于 1 时,会被设置为默认值 5 秒 Long: [1, Long.MAX_VALUE] 选填 5 重启后生效

4.2 注意事项

  1. 如果待加载的文件中,存在 mods 文件,应优先将 mods 文件移动到监听目录下面,然后再移动 tsfile 文件,且 mods 文件应和对应的 tsfile 文件处于同一目录。防止加载到 tsfile 文件时,加载不到对应的 mods 文件
1. FUNCTION moveFilesToListeningDirectory(sourceDirectory, listeningDirectory)
2. // 移动 mods 文件
3. modsFiles = searchFiles(sourceDirectory, "*mods*")
4. IF modsFiles IS NOT EMPTY
5. FOR EACH file IN modsFiles
6. MOVE(file, listeningDirectory)
7. END FOR
8. END IF

10. // 移动 tsfile 文件
11. tsfileFiles = searchFiles(sourceDirectory, "*tsfile*")
12. IF tsfileFiles IS NOT EMPTY
13. FOR EACH file IN tsfileFiles
14. MOVE(file, listeningDirectory)
15. END FOR
16. END IF
17. END FUNCTION

19. FUNCTION searchFiles(directory, pattern)
20. matchedFiles = []
21. FOR EACH file IN directory.files
22. IF file.name MATCHES pattern
23. APPEND file TO matchedFiles
24. END IF
25. END FOR
26. RETURN matchedFiles
27. END FUNCTION

29. FUNCTION MOVE(sourceFile, targetDirectory)
30. // 实现文件从 sourceFile 移动到 targetDirectory 的逻辑
31. END FUNCTION
  1. 禁止设置 Pipe 的 receiver 目录、存放数据的 data 目录等作为监听目录
  2. 禁止 load_active_listening_fail_dir 与 load_active_listening_dirs 存在相同的目录,或者互相嵌套
  3. 保证 load_active_listening_dirs 目录有足够的权限,在加载成功之后,文件将会被删除,如果没有删除权限,则会重复加载