数据导入

1. IoTDB 数据导入

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

2. import-data 脚本

  • 支持格式:CSV、SQL

2.1 运行命令:

# Unix/OS X
>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>]

# Windows
>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.当srcTsDataTypeboolean, dstTsDataType只能为booleantext.当srcTsDataTypeNaN, dstTsDataType只能为float, doubletext.当srcTsDataType为数值类型, dstTsDataType的精度需要高于srcTsDataType.例如:-typeInfer boolean=text,float=double

2.3 运行示例:

  • 导入当前data目录下的dump0_0.sql数据到本机 IoTDB 数据库中。
# Unix/OS X
>tools/import-data.sh -s ./data/dump0_0.sql
# Windows
>tools/import-data.bat -s ./data/dump0_0.sql
  • 将当前data目录下的所有数据以对齐的方式导入到本机 IoTDB 数据库中。
# Unix/OS X
>tools/import-data.sh -s ./data/ -fd ./failed/ -aligned true
# Windows
>tools/import-data.bat -s ./data/ -fd ./failed/ -aligned true
  • 导入当前data目录下的dump0_0.csv数据到本机 IoTDB 数据库中。
# Unix/OS X
>tools/import-data.sh -s ./data/dump0_0.csv -fd ./failed/
# Windows
>tools/import-data.bat -s ./data/dump0_0.csv -fd ./failed/
  • 将当前data目录下的dump0_0.csv数据以对齐的方式,一批导入100000条导入到192.168.100.1IP所在主机的 IoTDB 数据库中,失败的记录记在当前failed目录下,每个文件最多记1000条。
# Unix/OS X
>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
# Windows
>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 导入规范
  • 特殊字符转义规则:若Text类型的字段中包含特殊字符(例如逗号,),需使用反斜杠(\)​进行转义处理。
  • 支持的时间格式:yyyy-MM-dd‘T’HH:mm:ss, yyy-MM-dd HH:mm:ss, 或者 yyyy-MM-dd‘T’HH:mm:ss.SSSZ。
  • 时间戳列​必须作为数据文件的首列存在。
  1. CSV 文件示例
  • 时间对齐
-- header 中不包含数据类型
  Time,root.test.t1.str,root.test.t2.str,root.test.t2.var
  1970-01-01T08:00:00.001+08:00,"123hello world","123\,abc",100
  1970-01-01T08:00:00.002+08:00,"123",,

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

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

3. load-tsfile 脚本

  • 支持格式:TsFile

3.1 运行命令

# Unix/OS X
>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>] 

# Windows
>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待加载的脚本文件(夹)的本地目录路径
-osnone:不删除
mv:移动成功的文件到目标文件夹
cp:硬连接(拷贝)成功的文件到目标文件夹
delete:删除
-sd当--on_succcess为mv或cp时,mv或cp的目标文件夹。文件的文件名变为文件夹打平后拼接原有文件名当--on_succcess为mv或cp时需要填写是${EXEC_DIR}/success
-ofnone:跳过
mv:移动失败的文件到目标文件夹
cp:硬连接(拷贝)失败的文件到目标文件夹
delete:删除
-fd当--on_fail指定为mv或cp时,mv或cp的目标文件夹。文件的文件名变为文件夹打平后拼接原有文件名当--on_fail指定为mv或cp时需要填写${EXEC_DIR}/fail
-tn最大并行线程数8

3.3 运行示例:

# Unix/OS X
> tools/load-tsfile.sh -h 127.0.0.1 -p 6667 -u root -pw root -s /path/sql -os delete -of delete -tn 8
> 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 

# Windows
> 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 
> 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 能自动检测并加载这些文件,无需手动执行任何额外的加载操作。这种自动化流程不仅简化了用户的操作步骤,还减少了操作过程中可能出现的错误,有效降低了用户在使用过程中的复杂性。

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 文件
FUNCTION moveFilesToListeningDirectory(sourceDirectory, listeningDirectory)
    // 移动 mods 文件
    modsFiles = searchFiles(sourceDirectory, "*mods*")
    IF modsFiles IS NOT EMPTY
        FOR EACH file IN modsFiles
            MOVE(file, listeningDirectory)
        END FOR
    END IF

    // 移动 tsfile 文件
    tsfileFiles = searchFiles(sourceDirectory, "*tsfile*")
    IF tsfileFiles IS NOT EMPTY
        FOR EACH file IN tsfileFiles
            MOVE(file, listeningDirectory)
        END FOR
    END IF
END FUNCTION

FUNCTION searchFiles(directory, pattern)
    matchedFiles = []
    FOR EACH file IN directory.files
        IF file.name MATCHES pattern
            APPEND file TO matchedFiles
        END IF
    END FOR
    RETURN matchedFiles
END FUNCTION

FUNCTION MOVE(sourceFile, targetDirectory)
    // 实现文件从 sourceFile 移动到 targetDirectory 的逻辑
END FUNCTION
  1. 禁止设置 Pipe 的 receiver 目录、存放数据的 data 目录等作为监听目录

  2. 禁止 load_active_listening_fail_dirload_active_listening_dirs 存在相同的目录,或者互相嵌套

  3. 保证 load_active_listening_dirs 目录有足够的权限,在加载成功之后,文件将会被删除,如果没有删除权限,则会重复加载