暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

模拟数据生成,IoTDB批量导入

原创 肖小可爱乐乐 2024-06-10
334

前文导读

从本文中可以有以下收获

  • pg生成的数据如何应用到IoTDB上面
  • 清楚批量导入IoTDB的数据格式
  • IoTDB导入导出命令使用方法

需求

我们想要对IoTDB随机生成数据进行各种各样的测试,但是IoTDB没有pg那样友好的生成函数generate_series,如果自己写生成程序,又嫌太麻烦了!于是有一个想法,我们在pg上面生成各种各样丰富的数据,再把数据导出来,通过IoTDB的批量导放把数据搞进去。

环境

  • postgreSQL14
  • IoTDB1.3

PG数据生成

#生成表结构,假设这里有一个时间戳,一个名称,一个数据值,这是时序数据的基本结构 create table t3( c1 timestamp, c2 varchar(10),c3 float); #我们想到以毫秒为单位,1秒有1000个毫秒,毫秒下面还有微秒、纳秒,大部的工业生产用上微秒已经足够了,毕竟1秒钟产了1000条数据。 # (cast(s as numeric)/1000) 是秒除以1000,获得毫秒单位 #pg支持数组,array['数据名称']可以生成按需的各个名称 #generate_series(1, 10) 生成10条数据,如果把10变成100万,那么就是写入100万数据 #根据t3的结构生成10条数据,并写入t3 insert into t3(c1,c2,c3) select ('2023-12-28 13:25:38.000000'::timestamp) +concat((cast(s as numeric)/1000),'s')::INTERVAL,(array['car','phone','cat','dog','vechile','ship','dragon','cow','fish','house'])[ceil(random()*10)], random() FROM generate_series(1, 10) AS s; #字符结构是需要经过清洗的,注意时间格式 \copy (select to_char(c1, 'yyyy-MM-ddT HH:mm:ss.ms+08:00'),c2,c3 from t3) to '/tmp/tmp_t3.csv' with csv;

IoTDB导入数据

pg导出的一个csv文件,名称叫tmp_t3,我们发现还不能直接可以用,格式上有诸多问题,格式不对。这个好办,我们在IoTDB新建一个与PG一模一样的表结构,然而写入一条数据,再把这个数据以CSV的格式导出来。

IoTDB> create database root.test.xiao Msg: The statement is executed successfully. IoTDB> CREATE TIMESERIES root.test.xiao.type WITH DATATYPE=text, ENCODING=PLAIN; Msg: The statement is executed successfully. IoTDB> CREATE TIMESERIES root.test.xiao.price WITH DATATYPE=FLOAT,ENCODING=PLAIN; Msg: The statement is executed successfully.

导出数据

sh tools/export-csv.sh -h 127.0.0.1 -p 6667 -u root -pw root -td ./ -s sql.txt [root@server128 apache-iotdb-1.3.1-all-bin]# cat sql.txt select * from root.**;

数据格式如下,我们对csv tools的具体使用,可以看这个https://www.bookstack.cn/read/IoTDB-0.12.x-zh/b9276d10ddf9895c.md, 这里可以获取更多信息。

Time,Device,type,price
2024-02-18T01:02:38.001+08:00,root.test.xiao,"fish",0.1011639469056469
......

上述格式,Time对应的是时间,Device对应的是你的设备,price是机器对应的具体的数值,那好办,写个正则就好了。正则程序如下

#!/bin/bash device='root.test.xiao' file='/tmp/tmp_t3.csv' #替换空格,替换双引号,插入头文件,进行批量导入数据 sed -i 's/ //g' ${file} sed -i 's/[0-9]\(,\)/&root.test.xiao,\"/g' ${file} sed -i 's/,0/\"&/g' ${file} sed -i '1i\Time,Device,type,price' ${file} cat ${file} tools/import-csv.sh -h 127.0.0.1 -p 6667 -u root -pw root -f ${file} -fd ./failed #导入成功的话 ------------------------------------------ Starting IoTDB Client Import Script ------------------------------------------ Import completely!

我们也要采取官方推荐的待导入CSV数据格式

待导入 CSV 文件示例

通过时间对齐,并且header中不包含数据类型的数据。

 复制代码Time,root.test.t1.str,root.test.t2.str,root.test.t2.int1970-01-01T08:00:00.001+08:00,"123hello world","123\,abc",1001970-01-01T08:00:00.002+08:00,"123",,

通过时间对齐,并且header中包含数据类型的数据。

Time,root.test.t1.str(TEXT),root.test.t2.str(TEXT),root.test.t2.int(INT32)1970-01-01T08:00:00.001+08:00,"123hello world","123\,abc",1001970-01-01T08:00:00.002+08:00,"123",,

通过设备对齐,并且header中不包含数据类型的数据。

Time,Device,str,int1970-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中包含数据类型的数据。

Time,Device,str(TEXT),int(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

在导入csv数据之前,IoTDB必须建表如下

IoTDB> create database root.test.xiao Msg: The statement is executed successfully. IoTDB> CREATE TIMESERIES root.test.xiao.type WITH DATATYPE=text, ENCODING=PLAIN; Msg: The statement is executed successfully. IoTDB> CREATE TIMESERIES root.test.xiao.price WITH DATATYPE=FLOAT,ENCODING=PLAIN; Msg: The statement is executed successfully.

发现一些有意思的事情,如果pg导出的数据不以csv文件名结尾,会提示如下,虽然这个文件是CSV格式,但是导入程序会报错

------------------------------------------ Starting IoTDB Client Import Script ------------------------------------------ The file name must end with "csv" or "txt"!

能够导入数据格式如下

image.png

测试数据

基于IoTDB测试数据是否一致性,正好是100条数据

image.png

这下好了,可以随心所欲制造 自己想的数据。

最后修改时间:2024-06-11 13:19:08
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论