手动将CSV离线数据导入至IoTDB
应用场景
IoTDB(物联网数据库)是一体化收集、存储、管理与分析物联网时序数据的软件系统,采用轻量式架构,具有高性能和丰富的功能。
IoTDB支持以下方式批量导入或导出数据:
- 批量导入数据:通过import-csv.sh离线方式进行数据的导入。
- 批量导出数据:通过export-csv.sh离线方式进行数据的导出。

方案架构
IoTDB套件由若干个组件构成,共同形成数据收集、数据写入、数据存储、数据查询、数据可视化、数据分析等一系列功能。
图2展示了使用IoTDB套件的全部组件形成的整体应用架构,IoTDB特指其中的时间序列数据库组件。
- 用户可以通过JDBC/Session将来自设备传感器上采集的时序数据和服务器负载、CPU内存等系统状态数据、消息队列中的时序数据、应用程序的时序数据或者其他数据库中的时序数据导入到本地或者远程的IoTDB中。用户还可以将上述数据直接写成本地(或位于HDFS上)的TsFile文件。
- 用户可以将TsFile文件写入到HDFS上,进而满足Hadoop、Flink等数据处理任务的访问。
- 对于写入到HDFS或者本地的TsFile文件,可以利用TsFile-Hadoop或TsFile-Flink连接器,允许Hadoop或Flink进行数据处理。
- 对于分析的结果,可以写回成TsFile文件。
- IoTDB和TsFile还提供了相应的客户端工具,满足用户以SQL形式、脚本形式和图形形式写入和查看数据的各种需求。
操作流程
- 步骤1:创建MRS集群:创建一个包含有IoTDB组件的MRS集群。
- 步骤2:创建IoTDB用户:在Manager页面创建具有操作IoTDB表的权限的用户。
- 步骤3:导入CSV文件数据到IoTDB表中:使用import-csv.sh脚本导入CSV文件数据到IoTDB表中。
- 步骤4:导出IoTDB数据到CSV文件中:使用export-csv.sh脚本导出IoTDB表数据到CSV文件中。
步骤1:创建MRS集群
- 创建一个包含有IoTDB组件的MRS集群,详情请参见购买自定义集群。
本文以自定义购买的MRS 3.2.0-LTS.1版本的集群为例,集群已开启Kerberos认证。
- 集群购买成功后,在MRS集群的任一节点内,安装集群客户端,具体操作可参考安装并使用集群客户端。
例如客户端安装目录为“/opt/client”。
- 关闭IoTDB组件的SSL配置。
- 登录集群Manager界面,选择“集群 > 服务 > IoTDB > 配置”,搜索“SSL_ENABLE”,如果该参数值为“true”,需修改为“false”并单击“保存”,关闭SSL配置。
- 修改IoTDB客户端对应的参数关闭SSL配置:
cd 客户端安装目录/IoTDB/iotdb/conf
vi iotdb-client.env
修改“iotdb_ssl_enable”参数值为“false”,保存并退出。
- 在Manager界面,选择“集群 > 服务 > IoTDB”,选择页面右上角的“更多 > 重启服务”,输入当前用户密码并单击“确定”使配置生效。
步骤2:创建IoTDB用户
对于开启Kerberos认证的MRS集群,需提前准备具有相关组件操作权限的用户用于安全认证。
- 登录FusionInsight Manager,选择
,配置以下参数并单击“确定”:
- 角色名称:填写角色的名称,例如testrole。
- 配置资源权限:在“配置资源权限”的表格中选择“待操作集群的名称 > IoTDB > 普通用户权限”,勾选root根目录的“设置数据库”权限;再单击“root”,选择对应的存储组,勾选“创建”、“修改”、“写”、“读”权限。
- 选择“用户 > 添加用户”,在新增用户界面,创建一个人机用户,例如testuser。
- “用户组”需加入“iotdbgroup”用户组。
- “角色”加入步骤 1新增的角色。
- 使用新创建的testuser用户重新登录FusionInsight Manager,修改该用户的初始密码。
步骤3:导入CSV文件数据到IoTDB表中
- 按单设备时间有序地导入单文件多设备多测点数据,数据中存在空值
- 在本地准备CSV文件,例如文件名为“y1.csv”,文件中只包含一个设备的所有数据,且数据中存在空值,内容如下:
Time,root.y1.r1.s1.d1.value,root.y1.r1.s1.d1.temperature,root.y1.r1.s1.d1.humidity,root.y1.r1.s1.d1.status,root.y1.r1.s1.d2.value,root.y1.r1.s1.d2.temperature,root.y1.r1.s1.d2.humidity,root.y1.r1.s1.d2.status,root.y1.r1.s1.d3.value,root.y1.r1.s1.d3.temperature,root.y1.r1.s1.d3.humidity,root.y1.r1.s1.d3.status,root.y1.r1.s1.d4.value,root.y1.r1.s1.d4.temperature,root.y1.r1.s1.d4.humidity,root.y1.r1.s1.d4.status 2023-12-01 22:22:00,9426,43,30,False,5797,79,33,True,8740,29,53,True,9378,,,False 2023-12-02 10:09:19,2969,73,84,False,6017,80,42,False,6624,18,19,False,6903,,,True 2023-12-03 08:57:37,7553,74,41,True,1857,19,25,False,2131,93,36,True,4421,26,34,False 2023-12-04 23:49:51,4417,67,16,False,7098,18,5,True,9887,15,90,True,9670,87,68,False 2023-12-05 13:08:15,7708,69,55,False,8304,47,13,False,5877,100,87,True,8671,31,29,False 2023-12-06 12:05:09,3573,70,75,True,5674,80,38,False,3408,21,24,False,4557,47,37,False 2023-12-07 11:41:04,4506,67,81,True,4445,62,37,False,6847,20,39,True,1018,43,16,False 2023-12-08 00:15:47,48,84,94,False,1055,70,1,True,7625,76,69,True,8430,80,91,True 2023-12-09 15:55:22,2187,87,30,True,9367,84,2,False,1565,14,3,False,4465,62,51,True 2023-12-10 17:42:02,4099,0,59,False,5532,29,81,False,4153,29,29,True,4418,17,4,False
- 将CSV文件上传到安装客户端的节点中,例如“客户端安装目录/IoTDB/iotdb/tools”目录下。
- 不创建元数据,直接执行脚本导入CSV文件到IoTDB数据库中:
cd 客户端安装目录
source bigdata_env
kinit 组件业务用户
cd IoTDB/iotdb/tools
./import-csv.sh -h IoTDBServer的业务IP地址 -p IoTDBServer RPC端口 -f 文件名
命令执行后根据提示交互式输入业务用户名和对应密码。
- IoTDBServer实例节点的业务IP地址可在Manager界面,选择“集群 > 服务 > IoTDB > 实例”查看。
- IoTDBServer RPC端口可在Manager界面,选择“集群 > 服务 > IoTDB > 配置”,在参数“IOTDB_SERVER_RPC_PORT”中自行配置。默认端口如下:
- 开源端口默认值为:6667
- 定制端口默认值为:22260
端口定制/开源区分:创建LTS版本类型集群时,可以选择“组件端口”为“开源”或是“定制”,选择“开源”使用开源端口,选择“定制”使用定制端口。
- -f:用于指定想要导入的数据,可以指定文件或者文件夹。如果指定的是文件夹,将会把文件夹中所有后缀为txt与csv的文件进行批量导人。例如: -f filename.csv。
- -fd:用于指定一个目录来存放导入失败的文件,如果没有指定该参数,失败的文件将会被保存到源数据的目录中,文件名为源文件名加上.failed后缀。例如: -fd ./failed/。
- -aligned:是否使用aligned接口, 默认参数值为“false”。例如: -aligned true。
- -tp:用于指定时间精度,可选值包括ms(毫秒)、ns(纳秒)、us(微秒),默认值为ms。
- -linesPerFailedFile <int>:用于指定每个导入失败的文件写入数据的行数,默认值为10000,例如:-linesPerFailedFile 1。
执行结果中包含以下以下信息则表示数据导入成功:
Import completely!
- 执行以下命令登录IoTDB客户端:
cd 客户端安装目录/IoTDB/iotdb/sbin
./start-cli.sh -h IoTDBServer实例节点的业务IP地址 -p IoTDBServer RPC端口
运行该命令后,根据实际需求指定业务用户名:
- 执行以下命令查看导入的数据:
select * from root.y1.**;
查询导入数据正常,空值的数据显示为“null”:
图3 成功查询导入的数据
- 在本地准备CSV文件,例如文件名为“y1.csv”,文件中只包含一个设备的所有数据,且数据中存在空值,内容如下:
- 按设备时间有序地导入多文件按设备多测点不同库下所有数据,自动创建元数据
- 在本地准备4个CSV文件,文件名分别为“y2d1.csv”、“y2d2.csv”、“y3d1.csv”、“y3d2.csv”,单个文件中只包含一个设备的所有数据,内容如下:
- y2d1.csv:
Time,root.y2.r1.s1.d1.value,root.y2.r1.s1.d1.temperature,root.y2.r1.s1.d1.humidity,root.y2.r1.s1.d1.status 2023-11-01 06:34:19,6621,25,83,True 2023-11-02 06:28:18,4066,98,46,False 2023-11-03 07:44:50,7909,58,37,True 2023-11-04 15:27:01,837,42,27,False 2023-11-05 01:54:33,7942,70,14,False 2023-11-06 20:36:14,5047,30,3,True 2023-11-07 14:20:10,1434,4,87,True 2023-11-08 03:56:57,8651,39,61,True 2023-11-09 11:58:08,7109,88,64,True 2023-11-10 10:58:13,2333,41,40,False
- y2d2.csv:
Time,root.y2.r1.s1.d2.value,root.y2.r1.s1.d2.temperature,root.y2.r1.s1.d2.humidity,root.y2.r1.s1.d2.status 2023-11-01 06:34:19,6621,25,83,True 2023-11-02 06:28:18,4066,98,46,False 2023-11-03 07:44:50,7909,58,37,True 2023-11-04 15:27:01,837,42,27,False 2023-11-05 01:54:33,7942,70,14,False 2023-11-06 20:36:14,5047,30,3,True 2023-11-07 14:20:10,1434,4,87,True 2023-11-08 03:56:57,8651,39,61,True 2023-11-09 11:58:08,7109,88,64,True 2023-11-10 10:58:13,2333,41,40,False
- y3d1.csv:
Time,root.y3.r1.s1.d1.value,root.y3.r1.s1.d1.temperature,root.y3.r1.s1.d1.humidity,root.y3.r1.s1.d1.status 2023-11-01 06:34:19,6621,25,83,True 2023-11-02 06:28:18,4066,98,46,False 2023-11-03 07:44:50,7909,58,37,True 2023-11-04 15:27:01,837,42,27,False 2023-11-05 01:54:33,7942,70,14,False 2023-11-06 20:36:14,5047,30,3,True 2023-11-07 14:20:10,1434,4,87,True 2023-11-08 03:56:57,8651,39,61,True 2023-11-09 11:58:08,7109,88,64,True 2023-11-10 10:58:13,2333,41,40,False
- y3d2.csv:
Time,root.y3.r1.s1.d2.value,root.y3.r1.s1.d2.temperature,root.y3.r1.s1.d2.humidity,root.y3.r1.s1.d2.status 2023-11-01 06:34:19,6621,25,83,True 2023-11-02 06:28:18,4066,98,46,False 2023-11-03 07:44:50,7909,58,37,True 2023-11-04 15:27:01,837,42,27,False 2023-11-05 01:54:33,7942,70,14,False 2023-11-06 20:36:14,5047,30,3,True 2023-11-07 14:20:10,1434,4,87,True 2023-11-08 03:56:57,8651,39,61,True 2023-11-09 11:58:08,7109,88,64,True 2023-11-10 10:58:13,2333,41,40,False
- y2d1.csv:
- 在“客户端安装目录/IoTDB/iotdb/tools”目录下创建“d1”目录,并将1准备的4个CSV文件上传到该目录中。
- 不创建元数据,直接执行脚本导入CSV文件到IoTDB数据库中:
cd 客户端安装目录
source bigdata_env
kinit 组件业务用户
cd IoTDB/iotdb/tools
./import-csv.sh -h IoTDBServer的业务IP地址 -p IoTDBServer RPC端口 -f d1
命令执行后根据提示交互式输入业务用户名和对应密码。
- IoTDBServer实例节点的业务IP地址可在Manager界面,选择“集群 > 服务 > IoTDB > 实例”查看。
- IoTDBServer RPC端口可在参数“IOTDB_SERVER_RPC_PORT”中自行配置。默认端口如下:
- 开源端口默认值为:6667
- 定制端口默认值为:22260
端口定制/开源区分:创建LTS版本类型集群时,可以选择“组件端口”为“开源”或是“定制”,选择“开源”使用开源端口,选择“定制”使用定制端口。
- -f:用于指定想要导入的数据,可以指定文件或者文件夹。如果指定的是文件夹,将会把文件夹中所有后缀为txt与csv的文件进行批量导人。例如: -f d1。
- -fd:用于指定一个目录来存放导入失败的文件,如果没有指定该参数,失败的文件将会被保存到源数据的目录中,文件名为源文件名加上.failed后缀。例如: -fd ./failed/。
- -aligned:是否使用aligned接口, 默认参数值为“false”。例如: -aligned true。
- -tp:用于指定时间精度,可选值包括ms(毫秒)、ns(纳秒)、us(微秒),默认值为ms。
- -linesPerFailedFile <int>:用于指定每个导入失败的文件写入数据的行数,默认值为10000,例如:-linesPerFailedFile 1。
执行结果中包含以下以下信息则表示数据导入成功:
Import completely!
- 执行以下命令登录IoTDB客户端:
cd 客户端安装目录/IoTDB/iotdb/sbin
./start-cli.sh -h IoTDBServer实例节点的业务IP地址 -p IoTDBServer RPC端口
运行该命令后,根据实际需求指定业务用户名:
- 执行以下命令查看导入的数据:
select * from root.y2.r1.s1.d1;
select * from root.y2.r1.s1.d2;
select * from root.y3.r1.s1.d1;
select * from root.y3.r1.s1.d2;
查询导入数据正常。
图4 数据导入成功
- 在本地准备4个CSV文件,文件名分别为“y2d1.csv”、“y2d2.csv”、“y3d1.csv”、“y3d2.csv”,单个文件中只包含一个设备的所有数据,内容如下:
- 按时间有序地导入单文件内单设备多测点数据,导入数据前创建元数据
- 在本地准备CSV文件,文件名为“y4.csv”,文件中只包含一个设备的所有数据,内容如下:
Time,root.y4.r1.s1.d1.value,root.y4.r1.s1.d1.temperature,root.y4.r1.s1.d1.humidity,root.y4.r1.s1.d1.status 2023-11-01 06:34:19,6621,25,83,True 2023-11-02 06:28:18,4066,98,46,False 2023-11-03 07:44:50,7909,58,37,True 2023-11-04 15:27:01,837,42,27,False 2023-11-05 01:54:33,7942,70,14,False 2023-11-06 20:36:14,5047,30,3,True 2023-11-07 14:20:10,1434,4,87,True 2023-11-08 03:56:57,8651,39,61,True 2023-11-09 11:58:08,7109,88,64,True 2023-11-10 10:58:13,2333,41,40,False
- 将CSV文件上传至客户端所在节点,例如“客户端安装目录/IoTDB/iotdb/tools”目录下。
- 执行以下命令登录IoTDB客户端:
cd 客户端安装目录
source bigdata_env
kinit 组件业务用户
cd IoTDB/iotdb/sbin
./start-cli.sh -h IoTDBServer实例节点的业务IP地址 -p IoTDBServer RPC端口
运行该命令后,根据实际需求指定业务用户名:
- 执行以下命令在导入数据前创建元数据:
SET STORAGE GROUP TO root.y4.r1.s1.d1;
CREATE TIMESERIES root.y4.r1.s1.d1.value WITH DATATYPE=DOUBLE,ENCODING=RLE;
CREATE TIMESERIES root.y4.r1.s1.d1.temperature WITH DATATYPE=DOUBLE,ENCODING=PLAIN;
CREATE TIMESERIES root.y4.r1.s1.d1.humidity WITH DATATYPE=DOUBLE,ENCODING=RLE;
CREATE TIMESERIES root.y4.r1.s1.d1.status WITH DATATYPE=BOOLEAN,ENCODING=RLE;
- 执行以下命令,退出客户端。
quit;
- 执行脚本导入CSV文件到IoTDB数据库中:
cd 客户端安装目录/IoTDB/iotdb/tools
./import-csv.sh -h IoTDBServer实例节点的业务IP地址 -p IoTDBServer RPC端口 -f 文件名
命令执行后根据提示交互式输入业务用户名和对应密码。
- IoTDBServer实例节点的业务IP地址可在Manager界面,选择“集群 > 服务 > IoTDB > 实例”查看。
- IoTDBServer RPC端口可在Manager界面,选择“集群 > 服务 > IoTDB > 配置”,在参数“IOTDB_SERVER_RPC_PORT”中自行配置。默认端口如下:
- 开源端口默认值为:6667
- 定制端口默认值为:22260
端口定制/开源区分:创建LTS版本类型集群时,可以选择“组件端口”为“开源”或是“定制”,选择“开源”使用开源端口,选择“定制”使用定制端口。
- -f:用于指定想要导入的数据,可以指定文件或者文件夹。如果指定的是文件夹,将会把文件夹中所有后缀为txt与csv的文件进行批量导人。例如: -f filename.csv。
- -fd:用于指定一个目录来存放导入失败的文件,如果没有指定该参数,失败的文件将会被保存到源数据的目录中,文件名为源文件名加上.failed后缀。例如: -fd ./failed/。
- -aligned:是否使用aligned接口, 默认参数值为“false”。例如: -aligned true。
- -tp:用于指定时间精度,可选值包括ms(毫秒)、ns(纳秒)、us(微秒),默认值为ms。
- -linesPerFailedFile <int>:用于指定每个导入失败的文件写入数据的行数,默认值为10000,例如:-linesPerFailedFile 1。
执行结果中包含以下以下信息则表示数据导入成功:
Import completely!
- 重新登录IoTDB客户端,执行下命令查看导入的数据:
select * from root.y4.r1.s1.d1;
查询导入数据正常。
图5 数据导入成功
- 在本地准备CSV文件,文件名为“y4.csv”,文件中只包含一个设备的所有数据,内容如下:
- 按时间有序地导入指定数据库下单设备单测点的数据
- 在本地准备CSV文件,文件名为“y5.csv”,文件中只包含一个设备的所有数据,内容如下:
Time,root.y5.r1.s1.d1.temperature 2023-12-01 10:22:58,39 2023-12-02 03:26:55,51 2023-12-04 08:21:48,38 2023-12-05 04:08:12,54 2023-12-06 08:00:56,90 2023-12-07 19:27:50,48 2023-12-08 22:52:46,64 2023-12-09 14:52:12,78 2023-12-10 12:52:40,33 2023-12-11 13:47:16,58
- 将CSV文件上传到安装了客户端的节点中,例如“客户端安装目录/IoTDB/iotdb/tools”目录下。
- 执行脚本导入CSV文件到IoTDB数据库中:
cd 客户端安装目录
source bigdata_env
kinit 组件业务用户
cd IoTDB/iotdb/tools
./import-csv.sh -h IoTDBServer实例节点的业务IP地址 -p IoTDBServer RPC端口 -f 文件名
命令执行后根据提示交互式输入业务用户名和对应密码。
- IoTDBServer实例节点的业务IP地址可在Manager界面,选择“集群 > 服务 > IoTDB > 实例”查看。
- IoTDBServer RPC端口可在Manager界面,选择“集群 > 服务 > IoTDB > 配置”,在参数“IOTDB_SERVER_RPC_PORT”中自行配置。默认端口如下:
- 开源端口默认值为:6667
- 定制端口默认值为:22260
端口定制/开源区分:创建LTS版本类型集群时,可以选择“组件端口”为“开源”或是“定制”,选择“开源”使用开源端口,选择“定制”使用定制端口。
- -f:用于指定想要导入的数据,可以指定文件或者文件夹。如果指定的是文件夹,将会把文件夹中所有后缀为txt与csv的文件进行批量导人。例如: -f filename.csv。
- -fd:用于指定一个目录来存放导入失败的文件,如果没有指定该参数,失败的文件将会被保存到源数据的目录中,文件名为源文件名加上.failed后缀。例如: -fd ./failed/。
- -aligned:是否使用aligned接口, 默认参数值为“false”。例如: -aligned true。
- -tp:用于指定时间精度,可选值包括ms(毫秒)、ns(纳秒)、us(微秒),默认值为ms。
- -linesPerFailedFile <int>:用于指定每个导入失败的文件写入数据的行数,默认值为10000,例如:-linesPerFailedFile 1。
执行结果中包含以下以下信息则表示数据导入成功:
Import completely!
- 执行以下命令登录IoTDB客户端:
cd 客户端安装目录/IoTDB/iotdb/sbin
./start-cli.sh -h IoTDBServer实例节点的业务IP地址 -p IoTDBServer RPC端口
运行该命令后,根据实际需求指定业务用户名:
- 执行以下命令查看导入的数据:
select * from root.y5.r1.s1.d1;
查询导入数据正常。
图6 数据导入成功
- 在本地准备CSV文件,文件名为“y5.csv”,文件中只包含一个设备的所有数据,内容如下:
步骤4:导出IoTDB数据到CSV文件中
- 以客户端安装用户登录安装了客户端的节点,执行以下命令配置环境变量并认证用户:
cd 客户端安装目录
source bigdata_env
kinit 组件业务用户
- 执行以下命令创建存放导出数据的目录“e1”:
mkdir ./e1
- 切换到数据导出脚本所在目录:
cd IoTDB/iotdb/tools
- (可选)新建一个SQL文件,例如文件名为“s1.sql”,文件中包含一条或多条SQL语句。例如,导出指定数据库下设备为d1、物理量为temperature的所有数据的SQL语句为:
select temperature from root.y1.r1.s1.d1;
- 执行以下数据导出脚本导出IoTDB数据:
./export-csv.sh -h IoTDBServer实例节点的业务IP地址 -p IoTDBServer RPC端口 -td ./e1 -s s1.sql
命令运行后会出现CSV注入风险提示,输入“yes”继续执行命令,输入其他,则取消数据导出操作。
如果数据导出命令中没有设置-s参数,则输入yes后,还需输入要导出数据的查询语句,不同的查询结果会被保存到不同的CSV文件中。例如,导出指定数据库下设备为d1的所有数据,则命令为:
select * from root.y4.r1.s1.d1;
图7 导出IoTDB数据至CSV文件中其他相关的数据导出参数如下:
- -datatype:
- 默认为“true” ,表示在CSV文件的header中打印出时间序列对应的数据类型。例如:
Time, root.sg1.d1.s1(INT32), root.sg1.d1.s2(INT64)
- 值为“false”时,表示只在CSV的header中打印出时间序列名称,例如:
Time, root.sg1.d1.s1 , root.sg1.d1.s2
- 默认为“true” ,表示在CSV文件的header中打印出时间序列对应的数据类型。例如:
- -s <sql file>:用于指定一个SQL文件,里面包含一条或多条SQL语句。如果一个SQL文件中包含多条SQL语句,SQL语句之间应该用换行符进行分隔。每一条SQL语句对应一个输出的CSV文件。
- -td <directory>:用于为导出的CSV文件指定输出路径。
- -tf <time-format>:用于指定时间格式,时间格式必须遵守ISO 8601标准。如果想要以时间戳方式来保存时间,需设置为-tf timestamp。例如,-tf yyyy-MM-dd\ HH:mm:ss或-tf timestamp。
- -linesPerFile <int>:用于指定导出的dump文件的最大行数,默认值为“10000”。例如,-linesPerFile 1。
- -t <timeout>:用于指定session查询时的超时时间,单位为ms。
- -datatype:
- 切换到数据存放目录,查看导出的CSV文件的数据情况:
vim dump0_0.csv
例如,查看导出指定数据库下设备为d1的所有数据为:
图8 查看导出的数据