Apache-iotdb物联网数据库的安装及使用

一、简介

>Apache IoTDB (Database for Internet of Things) is an IoT native database with high performance for data management and analysis, deployable on the edge and the cloud. Due to its light-weight architecture, high performance and rich feature set together with its deep integration with Apache Hadoop, Spark and Flink, Apache IoTDB can meet the requirements of massive data storage, high-speed data ingestion and complex data analysis in the IoT industrial fields.

>Apache IoTDB(物联网数据库)是一款专为物联网设计的高性能数据库,适用于数据管理和分析,既可在边缘部署,也可在云端部署。由于其轻量级架构、高性能以及丰富的功能集,加上与Apache Hadoop、Spark和Flink的深度集成,Apache IoTDB可以满足物联网工业领域对海量数据存储、高速数据摄取和复杂数据分析的需求。

官网:https://iotdb.apache.org/

二、安装(单机版)

官方文档参考:https://iotdb.apache.org/UserGuide/latest/QuickStart/QuickStart.html

1.安装前置条件

Java >= 1.8 (Please make sure the environment path has been set)
Set the max open files num as 65535 to avoid “too many open files” problem。

#jdk 安装1.8或以上,略#修改文件句柄数量
##临时设置
sudo sysctl -w net.core.somaxconn=65535
##永久设置
vi /etc/sysctl.conf 后加入参数
net.core.somaxconn=65535
然后执行
sysctl -p

下面的这些我为了保险也设置了一下

####
cat >> /etc/security/limits.conf << EOF
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
EOF####
sed -i 's/^*          soft    nproc     65536$/*          soft    nproc     65536/' /etc/security/limits.d/20-nproc.conf####
cat >> /etc/sysctl.conf << EOF
vm.max_map_count=655360
EOFsysctl -p 

1.下载及解压到安装目录

下载:

>wget https://www.apache.org/dyn/closer.cgi/iotdb/1.3.0/apache-iotdb-1.3.0-all-bin.zip

解压:

#解压到/home/testuser目录下
unzip apache-iotdb-1.3.0-all-bin.zip -d /home/testuser

2.启动

# Unix/OS X
> cd /home/testuser/apache-iotdb-1.3.0-all-bin
> bash sbin/start-standalone.sh# Windows
> sbin\start-standalone.bat

3.停止

# Unix/OS X
> bash sbin/stop-standalone.sh# Windows
> sbin\stop-standalone.bat

二、安装(集群版)

官网文档:https://iotdb.apache.org/UserGuide/latest/QuickStart/ClusterQuickStart.html

1.集群安装规划

服务安装规划

IPRole
192.168.56.101ConfigNode,DataNode
192.168.56.102ConfigNode,DataNode
192.168.56.103ConfigNode,DataNode

端口规划

ServiceConfigNodeDataNode
Port10710,107206667,10730,10740,10750,10760

2.前置条件(所有机器上执行)

Java >= 1.8 (Please make sure the environment path has been set)
Set the max open files num as 65535 to avoid “too many open files” problem。

#jdk 安装1.8或以上,略#修改文件句柄数量
##临时设置
sudo sysctl -w net.core.somaxconn=65535
##永久设置
vi /etc/sysctl.conf 后加入参数
net.core.somaxconn=65535
然后执行
sysctl -p

下面的这些我为了保险也设置了一下

####
cat >> /etc/security/limits.conf << EOF
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
EOF####
sed -i 's/^*          soft    nproc     65536$/*          soft    nproc     65536/' /etc/security/limits.d/20-nproc.conf####
cat >> /etc/sysctl.conf << EOF
vm.max_map_count=655360
EOFsysctl -p 

3.下载及解压(所有机器上执行)

下载:

>wget https://www.apache.org/dyn/closer.cgi/iotdb/1.3.0/apache-iotdb-1.3.0-all-bin.zip

解压:

#解压到/home/testuser目录下
unzip apache-iotdb-1.3.0-all-bin.zip -d /home/testuser

4.配置

(1)192.168.56.101

iotdb-confignode.properties:

cn_internal_address=192.168.56.101
cn_seed_config_node=192.168.56.101:10710

iotdb-datanode.properties:

dn_rpc_address=192.168.56.101
dn_internal_address=192.168.56.101
dn_seed_config_node=192.168.56.101:10710

(2)192.168.56.102

iotdb-confignode.properties:

cn_internal_address=192.168.56.102
cn_seed_config_node=192.168.56.101:10710

iotdb-datanode.properties:

dn_rpc_address=192.168.56.102
dn_internal_address=192.168.56.102
dn_seed_config_node=192.168.56.101:10710

(3)192.168.56.103

iotdb-confignode.properties:

cn_internal_address=192.168.56.103
cn_seed_config_node=192.168.56.101:10710

iotdb-datanode.properties:

dn_rpc_address=192.168.56.103
dn_internal_address=192.168.56.103dn_seed_config_node=192.168.56.101:10710

注意:上面的配置cn_target_config_node_list,cn_seed_config_node,三台上使用的都是种子节点的IP:192.168.56.101

5.启动集群

(1)防火墙开放

需要开放6667,10710,10720,10730,10740,10750,10760 这些端口的访问权限,我这里使用的是firewalld,你也可以使用iptables

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.101" port protocol="tcp" port="6667" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.101" port protocol="tcp" port="10710" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.101" port protocol="tcp" port="10720" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.101" port protocol="tcp" port="10730" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.101" port protocol="tcp" port="10740" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.101" port protocol="tcp" port="10750" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.101" port protocol="tcp" port="10760" accept"firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.102" port protocol="tcp" port="6667" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.102" port protocol="tcp" port="10710" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.102" port protocol="tcp" port="10720" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.102" port protocol="tcp" port="10730" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.102" port protocol="tcp" port="10740" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.102" port protocol="tcp" port="10750" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.102" port protocol="tcp" port="10760" accept"firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.103" port protocol="tcp" port="6667" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.103" port protocol="tcp" port="10710" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.103" port protocol="tcp" port="10720" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.103" port protocol="tcp" port="10730" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.103" port protocol="tcp" port="10740" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.103" port protocol="tcp" port="10750" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.103" port protocol="tcp" port="10760" accept"firewall-cmd --reload

(2)启动集群

启动第一个节点(start the first node,192.168.56.101):

#1.启动第一个节点(start the first node,192.168.56.101)
cd /home/testuser/apache-iotdb-1.3.0-all-bin
sbin/start-standalone.sh
tail -f logs/log_datanode_all.log

启动其他节点start service ConfigNode and DataNode in other nodes,192.168.56.101,192.168.56.103

cd /home/testuser/apache-iotdb-1.3.0-all-bin
sbin/start-standalone.sh
tail -f logs/log_datanode_all.log

(3)检查集群

#随便找哪一台集群机器,执行命令,下面的 -h 后的ip可以是集群中的任何一个ip
cd /home/testuser/apache-iotdb-1.3.0-all-bin
./sbin/start-cli.sh -h 192.168.56.101#查看集群状态
show cluster;IoTDB> show cluster;
+------+----------+-------+---------------+------------+-------+---------+
|NodeID|  NodeType| Status|InternalAddress|InternalPort|Version|BuildInfo|
+------+----------+-------+---------------+------------+-------+---------+
|     0|ConfigNode|Running| 192.168.56.101|       10710|  1.3.0|  fe787ca|
|     2|ConfigNode|Running| 192.168.56.102|       10710|  1.3.0|  fe787ca|
|     4|ConfigNode|Running| 192.168.56.103|       10710|  1.3.0|  fe787ca|
|     1|  DataNode|Running| 192.168.56.101|       10730|  1.3.0|  fe787ca|
|     3|  DataNode|Running| 192.168.56.102|       10730|  1.3.0|  fe787ca|
|     5|  DataNode|Running| 192.168.56.103|       10730|  1.3.0|  fe787ca|
+------+----------+-------+---------------+------------+-------+---------+
Total line number = 6
It costs 0.317s

6.扩容

Expand means add services of ConfigNode or DataNode into an existing IoTDB cluster.

1.配置

iotdb-confignode.properties:

cn_internal_address=192.168.56.104
cn_seed_config_node=192.168.56.101:10710

iotdb-datanode.properties:

dn_rpc_address=192.168.56.104
dn_internal_address=192.168.56.104dn_seed_config_node=192.168.56.101:10710

2.防火墙加入

在原来的集群的三台机上执行

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.104" port protocol="tcp" port="6667" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.104" port protocol="tcp" port="10710" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.104" port protocol="tcp" port="10720" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.104" port protocol="tcp" port="10730" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.104" port protocol="tcp" port="10740" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.104" port protocol="tcp" port="10750" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.104" port protocol="tcp" port="10760" accept"firewall-cmd --reload

同时,新加的那台机器也需要执行启动集群步骤中的防火墙开放操作,让几台机器之间的端口能互通

3.启动

cd /home/testuser/apache-iotdb-1.3.0-all-bin
sbin/start-standalone.sh
tail -f logs/log_datanode_all.log

查看启动后是否已加入集群

IoTDB> show cluster;
+------+----------+-------+---------------+------------+-------+---------+
|NodeID|  NodeType| Status|InternalAddress|InternalPort|Version|BuildInfo|
+------+----------+-------+---------------+------------+-------+---------+
|     0|ConfigNode|Running| 192.168.56.101|       10710|  1.3.0|  fe787ca|
|     2|ConfigNode|Running| 192.168.56.103|       10710|  1.3.0|  fe787ca|
|     4|ConfigNode|Running| 192.168.56.102|       10710|  1.3.0|  fe787ca|
|     6|ConfigNode|Running| 192.168.56.104|       10710|  1.3.0|  fe787ca|
|     1|  DataNode|Running| 192.168.56.101|       10730|  1.3.0|  fe787ca|
|     3|  DataNode|Running| 192.168.56.103|       10730|  1.3.0|  fe787ca|
|     5|  DataNode|Running| 192.168.56.102|       10730|  1.3.0|  fe787ca|
|     7|  DataNode|Running| 192.168.56.104|       10730|  1.3.0|  fe787ca|
+------+----------+-------+---------------+------------+-------+---------+
Total line number = 8
It costs 0.013s

7.缩容

Shrink means removing a service from the IoTDB cluster.
以对192.168.56.102进行移除为例:

(1)移除ConfigNode,shrink service ConfigNode

cd /home/testuser/apache-iotdb-1.3.0-all-bin
# way 1: shrink with ip:port
sbin/remove-confignode.sh 192.168.56.102:10710# way 2: shrink with NodeID of `show cluster`
sbin/remove-confignode.sh 6

(2)移除DataNode,shrink service DataNode

cd /home/testuser/apache-iotdb-1.3.0-all-bin
# way 1: shrink with ip:port
sbin/remove-datanode.sh 192.168.56.102:6667# way 2: shrink with NodeID of `show cluster`
sbin/remove-confignode.sh 7

(3)检查,check the result

IoTDB> show cluster
+------+----------+-------+---------------+------------+-------+---------+
|NodeID|  NodeType| Status|InternalAddress|InternalPort|Version|BuildInfo|
+------+----------+-------+---------------+------------+-------+---------+
|     0|ConfigNode|Running| 192.168.56.101|       10710|  1.3.0|  fe787ca|
|     2|ConfigNode|Running| 192.168.56.103|       10710|  1.3.0|  fe787ca|
|     6|ConfigNode|Running| 192.168.56.104|       10710|  1.3.0|  fe787ca|
|     1|  DataNode|Running| 192.168.56.101|       10730|  1.3.0|  fe787ca|
|     3|  DataNode|Running| 192.168.56.103|       10730|  1.3.0|  fe787ca|
|     7|  DataNode|Running| 192.168.56.104|       10730|  1.3.0|  fe787ca|
+------+----------+-------+---------------+------------+-------+---------+
Total line number = 6

8.【reference】Cleanup,如果想清除集群数据重新初始化

如果想重新初始化集群,结束所有进程,然后删除data和logs目录,并重新启动即可。

(1).结束进程

End processes of ConfigNode and DataNode

# 1. Stop services ConfigNode and DataNode
sbin/stop-standalone.sh# 2. Check whether there are IoTDB processes left or not
jps
# 或者
ps -ef|grep iotdb# 3. If there is any IoTDB process left, kill it
kill -9 <pid>
# If there is only 1 IoTDB instance, execue command below to remove all IoTDB process
ps -ef|grep iotdb|grep -v grep|tr -s '  ' ' ' |cut -d ' ' -f2|xargs kill -9

(2).清除数据

Remove directories of data and logs

cd /home/testuser/apache-iotdb-1.3.0-all-bin
rm -rf data logs

三、简单使用

1.简单命令

#连接登录:
> bash sbin/start-cli.sh -h 127.0.0.1 -p 6667 -u root -pw root#创建数据库
IoTDB> create database root.ln#查看数据库
IoTDB> SHOW DATABASES#创建timeseries
IoTDB> CREATE TIMESERIES root.ln.wf01.wt01.status WITH DATATYPE=BOOLEAN, ENCODING=PLAIN
IoTDB> CREATE TIMESERIES root.ln.wf01.wt01.temperature WITH DATATYPE=FLOAT, ENCODING=RLE#查看timeseries
IoTDB> SHOW TIMESERIES
IoTDB> SHOW TIMESERIES root.ln.wf01.wt01.status#插入数据
IoTDB> INSERT INTO root.ln.wf01.wt01(timestamp,status) values(100,true);
IoTDB> INSERT INTO root.ln.wf01.wt01(timestamp,status,temperature) values(200,false,20.71)#查询数据
IoTDB> SELECT * FROM root.ln.wf01.wt01#退出登录
IoTDB> quit
IoTDB> exit

2.修改root密码

IoTDB > ALTER USER root SET PASSWORD 'newpwd';

四、API调用

(1)Java Native

https://iotdb.apache.org/UserGuide/latest/API/Programming-Java-Native-API.html#session-pool-for-native-api

引入maven

<dependencies><dependency><groupId>org.apache.iotdb</groupId><artifactId>iotdb-session</artifactId><version>1.3.0</version></dependency>
</dependencies>

Session初始化测试

一般不使用,采用本机localhost和6667端口及默认账号密码root/root初始化Session

		// use default configuration Session session = new Session.Builder().build();System.out.println(session);session.open();session.close();

通过Session.Builder构造器初始化Session,采用默认的账号root和默认密码root,指定IP和端口

		// initialize with a single nodeSession session = new Session.Builder().host(host).port(port).build();session.open();System.out.println(session);session.close();

采用自定义的账号和密码码初始化Session

		Session session = new Session.Builder().host(host).port(port).username("root").password("123456").build();

有多个节点的情况下,通过Session.Builder构造器初始化Session

		// initialize with multiple nodesList<String> nodeUrls = new ArrayList<>();nodeUrls.add("192.168.56.101:6667");nodeUrls.add("192.168.56.102:6667");nodeUrls.add("192.168.56.103:6667");Session session = new Session.Builder().nodeUrls(nodeUrls).username("root").password("123456").build();

数据库管理测试

创建数据库

		String storageGroupId = "root.group1";session.setStorageGroup(storageGroupId);

删除数据库

		String storageGroupId = "root.group1";session.deleteStorageGroup(storageGroupId);

删除多个

		List<String> storageGroupIds = new ArrayList<String>();storageGroupIds.add("root.group1");storageGroupIds.add("root.group2");session.deleteStorageGroups(storageGroupIds);

Timeseries Test

创建Timeseries

			session.createTimeseries("root.sestest.wf01.wt01.s0", TSDataType.INT32, TSEncoding.RLE, CompressionType.SNAPPY);session.createTimeseries("root.sestest.wf01.wt01.s1", TSDataType.INT32, TSEncoding.RLE, CompressionType.SNAPPY);

删除Timeseries

//可以传一个timeseries//session.deleteTimeseries("root.sestest.wf01.wt01.s0");//session.deleteTimeseries("root.sestest.wf01.wt01.s1");//也可以传多个timeseriesList<String> timeseries = new ArrayList<String>();timeseries.add("root.sestest.wf01.wt01.s0");timeseries.add("root.sestest.wf01.wt01.s1");session.deleteTimeseries(timeseries);

检查是否存在

		String timeseries = "root.sestest.wf01.wt01.s0";System.out.println(session.checkTimeseriesExists(timeseries));

Tablet Insert

	/*** 插入Tablet* @throws StatementExecutionException* @throws IoTDBConnectionException*/@Testpublic void insertTabletTest() throws StatementExecutionException, IoTDBConnectionException {int BATCH_INSERT_SIZE = 10000;long TOTAL_INSERT_ROW_COUNT = 20003L;session.setFetchSize(2048);session.open(false);/** 一个Tablet例子:* deviceID: root.ln.wf01.wt01* time status, temperature, speed* 1    true        1.0       1* 2    false       2.0       2* 3    true        3.0       3*/// 设置设备名字,设备下面的传感器名字,各个传感器的类型List<MeasurementSchema> schemaList = new ArrayList<>();schemaList.add(new MeasurementSchema("status", TSDataType.BOOLEAN));schemaList.add(new MeasurementSchema("temperature", TSDataType.DOUBLE));schemaList.add(new MeasurementSchema("speed", TSDataType.INT64));Tablet tablet = new Tablet("root.ln.wf01.wt02", schemaList, BATCH_INSERT_SIZE);// 以当前时间戳作为插入的起始时间戳long timestamp = System.currentTimeMillis();long row = 0;for (row = 0; row < TOTAL_INSERT_ROW_COUNT; row++) {int rowIndex = tablet.rowSize++;tablet.addTimestamp(rowIndex, timestamp);// 随机生成数据tablet.addValue("status", rowIndex, (row & 1) == 0);tablet.addValue("temperature", rowIndex, (double) row);tablet.addValue("speed", rowIndex, row);if (tablet.rowSize == tablet.getMaxRowNumber()) {session.insertTablet(tablet);tablet.reset();System.out.println("已经插入了:" + (row + 1) + "行数据");}timestamp++;}// 插入剩余不足 BATCH_INSERT_SIZE的数据if (tablet.rowSize != 0) {session.insertTablet(tablet);tablet.reset();System.out.println("已经插入了:" + (row) + "行数据");}}

Record Insert Test

	@Testpublic void insertRecordTest() throws IoTDBConnectionException, StatementExecutionException {//session.setStorageGroup("root.group1");String deviceId = "root.group1.device1";List<String> measurements = new ArrayList<>();measurements.add("s0");measurements.add("s1");measurements.add("s2");List<TSDataType> types = new ArrayList<>();types.add(TSDataType.INT32);types.add(TSDataType.INT32);types.add(TSDataType.INT32);List<Object> values = new ArrayList<>();values.add(1);values.add(2);values.add(3);long timestamp = System.currentTimeMillis();session.insertRecord(deviceId, timestamp, measurements, types, values);}

DeleteData Test

删除数据测试

	/*** 删除数据测试,* 参数timestamp为long类型,表示要删除的数据的时间,在这时间或这时间之前的数据将删除* Delete data before or equal to a timestamp of one or several timeseries* @throws StatementExecutionException */@Testpublic void deleteDataTest() throws StatementExecutionException {String deviceId = "root.group1.device2.s0";long timestamp = System.currentTimeMillis();System.out.println(timestamp);try {session.deleteData(deviceId, timestamp);} catch (IoTDBConnectionException e) {e.printStackTrace();}}

批量删除数据测试

	/*** 批量删除数据测试,* 参数timestamp为long类型,表示要删除的数据的时间,在这时间或这时间之前的数据将删除* Delete data before or equal to a timestamp of one or several timeseries* @throws StatementExecutionException*/@Testpublic void deleteDatasTest() throws StatementExecutionException {List<String> paths = new ArrayList<String>();paths.add("root.group1.device2.s0");paths.add("root.group1.device2.s1");paths.add("root.group1.device2.s2");//删除当前时间以前的数据long timestamp = System.currentTimeMillis();try {session.deleteData(paths, timestamp);} catch (IoTDBConnectionException e) {e.printStackTrace();}}

查询测试QueryTest

查询数据

使用session.executeRawDataQuery方法

	/*** 查询数据*/@Testpublic void executeRawDataQueryTest() throws StatementExecutionException, IoTDBConnectionException {List<String> paths = new ArrayList<>();paths.add("root.ln.wf01.wt01.temperature");paths.add("root.ln.wf01.wt01.speed");paths.add("root.ln.wf01.wt01.status");String startDateTimeStr = "2024-01-01 00:00:00";  LocalDateTime ldt = LocalDateTime.parse(startDateTimeStr,DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));Date date = Date.from(ldt.atZone( ZoneId.systemDefault()).toInstant());long startTime = date.getTime();//当前时间long endTime = System.currentTimeMillis();SessionDataSet sessionDataSet = session.executeRawDataQuery(paths, startTime, endTime);while(sessionDataSet.hasNext()) {RowRecord rowRecord = sessionDataSet.next();System.out.println(rowRecord);}}

查询最新数据

使用session.executeLastDataQuery方法

	/*** 查询最新数据* 查询指定时间以后的最新数据* @throws StatementExecutionException* @throws IoTDBConnectionException*/@Testpublic void executeLastDataQueryTest() throws StatementExecutionException, IoTDBConnectionException {List<String> paths = new ArrayList<>();paths.add("root.ln.wf01.wt01.temperature");paths.add("root.ln.wf01.wt01.speed");paths.add("root.ln.wf01.wt01.status");//查询指定时间以后的最新数据,这里指定时间为"2024-01-01 00:00:00";String startDateTimeStr = "2024-01-01 00:00:00";  LocalDateTime ldt = LocalDateTime.parse(startDateTimeStr,DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));Date date = Date.from(ldt.atZone( ZoneId.systemDefault()).toInstant());long startTime = date.getTime();SessionDataSet sessionDataSet = session.executeLastDataQuery(paths, startTime);while(sessionDataSet.hasNext()) {RowRecord rowRecord = sessionDataSet.next();System.out.println(rowRecord);}}

IoTDB-SQL Interface(根据sql查询数据)

使用session.executeQueryStatement方法

	/*** IoTDB-SQL Interface* Sql语句接口,* @throws StatementExecutionException* @throws IoTDBConnectionException*/@Testpublic void executeQueryStatement() throws StatementExecutionException, IoTDBConnectionException {SessionDataSet sessionDataSet = session.executeQueryStatement("select * from root.ln.wf01.wt03");while(sessionDataSet.hasNext()) {RowRecord rowRecord = sessionDataSet.next();System.out.println(rowRecord);}}

IoTDB-SQL Interface(根据sql更新数据)

使用session.executeNonQueryStatement方法

	@Testpublic void executeNonQueryStatement() throws StatementExecutionException, IoTDBConnectionException {session.executeNonQueryStatement("INSERT INTO root.ln.wf01.wt03(timestamp,status) values(200,true);");}

五、源码下载

github: https://github.com/jxlhljh/iotdbTest.git
gitee: https://gitee.com/jxlhljh/iotdbTest.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/639007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬虫工作量由小到大的思维转变---<第三十七章 Scrapy redis里面的key >

前言: 终于找到机会,开始把scrapy-redis细致地给大伙通一通了! 为什么非要细致讲scrapy-redis呢? 1.市面上关于scrapy-redis的教程,都比较笼统; demo级别好写,但是一旦上了项目,就问题百出!2.scrapy-redis里面的思路,其实跟单个爬虫或者集合式爬虫他的思路有点不一样; 正文…

Java代码审计Shiro反序列化CB1链source入口sink执行gadget链

目录 0x00 前言 0x01 CC链&CB链简介 1. Commons Collections链是什么&#xff1f; 2. Commons BeanUtils链是什么&#xff1f; 0x02 测试Commons BeanUtils1链 0x03 Shiro550 - Commons BeanUtils1链 - 跟踪分析&#xff08;无依赖&#xff09; 1. 前置知识 2. Co…

Node开发基础

1. 概述 1.1 为什么要学习服务器端开发基础 能够和后端程序员更加紧密的配合 网站业务逻辑前置&#xff0c;学习前端技术需要后端技术支撑 扩宽知识视野&#xff0c;能够站在更高的角度审视整个项目 1.2 服务器端开发要做的事情 实现网站的业务逻辑 ---网站登录部分&#…

矩阵重叠问题判断

创作背景 看到一道题目有感而发想写一篇题解&#xff0c;涉及的是一种逆向思维 桌面窗体重叠 - 洛谷https://www.luogu.com.cn/problem/U399827题目来源于《信息学奥赛课课通》 大致就是给一个长方形的左上顶点坐标&#xff08;x1,y1&#xff09;和右下顶点坐标&#xff08;x…

【设计模式】适配器和桥接器模式有什么区别?

今天我探讨一下适配器模式和桥接模式&#xff0c;这两种模式往往容易被混淆&#xff0c;我们希望通过比较他们的区别和联系&#xff0c;能够让大家有更清晰的认识。 适配器模式&#xff1a;连接不兼容接口 当你有一个类的接口不兼容你的系统&#xff0c;而你又不希望修改这个…

mini-spring-Bean含参实例化(三)

上一节&#xff0c;bean是在AbstractAutowireCapableBeanFactory.doCreateBean方法中用beanClass.newInstance()来实例化&#xff0c;仅适用于bean有无参构造函数的情况。 本节考虑含参的bean的实例化 考虑两个问题 一、串流程从哪合理的把构造函数的入参信息传递到实例化操作里…

各行业领域向chatgpt高质量提问的方式

一、技术/业务/事项咨询&#xff1a; ChatGPT可以回答关于技术领域以及工作生活等各方面的问题&#xff0c;包括最佳实践、开发工具、编程语言选择等&#xff0c;咨询标准方案等。 常见问法&#xff1a; 我准备做***&#xff0c;【目前的选择有***】&#xff0c;请告诉我选哪…

sql注入基础

一、SQL注入攻击的根源可以归结为两个主要因素: 程序命令和用户数据之间缺乏有效的隔离措施,以及对用户输入数据的信任。 程序命令和用户数据之间缺乏隔离:在一个应用程序中,程序命令(如SQL语句)和用户数据(即用户输入)应该被严格分离,以避免恶意用户利用输入数据来改…

云服务器定价_云服务器价格_云主机计费模式_腾讯云

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

嵌入式培训机构四个月实训课程笔记(完整版)-C++和QT编程第六天-Qt UDP编程(物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1-u7GvgM0TLuiy9z7LYQ80Q?pwd1688 提取码&#xff1a;1688 在Qt中提供了QUdpSocket 类来进行UDP数据报&#xff08;datagrams&#xff09;的发送和接收。这里我们还要了解一个名词Socket&#xff0c;也就是常说的“套接字”。 Qt 网络…

2024.1.18力扣每日一题——拿出最少数目的魔法豆

2024.1.18 题目来源我的题解方法一 排序前缀和方法二 优化版本 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2171 我的题解 方法一 排序前缀和 结果与原始顺序无关&#xff0c;因此先进行排序&#xff0c;然后计算前缀和。 有官方题解证明&#xff1a;最终在 拿出最少…

ImageMagick使用手册

ImageMagick使用手册 文章目录 ImageMagick使用手册ImageMagick是什么指令总结1.查看版本2.官网验证指令解读3.svg转png4.png转ico5.将指定文件夹中的所有PNG图像转换为ICO图标 本教程持续更新&#xff0c;我学到多少就更新多少。关于ffmpeg如何安装可以看上一篇博客win系统环境…

zk集群--启动阶段集群选举

1.概述 zk作为一个内存数据库产品&#xff0c;启动一个zk实例对外提供服务的方式成为单机模式。既然单机模式就可以实现请求处理&#xff0c;那为何要引入集群模式呢&#xff0c;引入集群模式付出了那些代价呢&#xff0c;相应的有取得了那些收益呢&#xff1f; 首先&#xf…

强化学习(四)动态规划——1

动态规划算法&#xff08;DP&#xff09;&#xff1a;在马尔可夫决策过程&#xff08;MDP&#xff09;的完美环境模型下计算最优策略。但其在强化学习中实用性有限&#xff0c;其一是它是基于环境模型已知&#xff1b;其二是它的计算成本很大。但它在理论伤仍然很重要&#xff…

【Unity】RayMarching体积云理论学习

RayMarching 体积云 RayMarching 是一种处理体积物体的方法 RayMarching 体积云的制作是基于屏幕后处理 屏幕空间重建世界坐标 目的是把屏幕坐标的每一个像素点转化成Unity世界坐标&#xff0c;可以得到射线的方向 如何在需要渲染的物体或者场景中使用RayMarching&#xff…

2023年12月青少年机器人技术等级考试(五级)理论综合试卷

2023年12月青少年机器人技术等级考试&#xff08;五级&#xff09;理论综合试卷 单选题 第 1 题 单选题 通常状况下&#xff0c;ESP32 WROOM模组的工作电压是&#xff1f;&#xff08; &#xff09; A.3V B.3.3V C.3.6V D.5V 第 2 题 单选题 ESP32 WROOM模组中核&am…

PHP AES加解密示例【详解】

PHP AES加解密示例 前言 在Web开发中&#xff0c;数据的安全性至关重要。AES&#xff08;Advanced Encryption Standard&#xff09;是一种常用的对称加密算法&#xff0c;用于保护敏感数据的安全性。本文将详细介绍在PHP中如何使用AES算法进行加解密操作&#xff0c;以确保数…

java大数据hadoop2.9.2 Linux安装mariadb和hive

一、安装mariadb 版本centos7 1、检查Linux服务器是否已安装mariadb yum list installed mariadb* 2、如果安装了&#xff0c;想要卸载 yum remove mariadb rm -rf /etc/my.cnf rm -rf /var/lib/mysql 才能完全删除 3、安装mariadb 在线网络安装 yum install -y mari…

Webpack5入门到原理17:Loader 原理

loader 概念 帮助 webpack 将不同类型的文件转换为 webpack 可识别的模块。 loader 执行顺序 分类 pre&#xff1a; 前置 loadernormal&#xff1a; 普通 loaderinline&#xff1a; 内联 loaderpost&#xff1a; 后置 loader 执行顺序 4 类 loader 的执行优级为&#xff…

【ARM 嵌入式 编译系列 2.6 -- GCC 编译时间统计参数 -ftime-report -Q 】

请阅读【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 文章目录 GCC 编译时间统计 GCC 编译时间统计 如果你想要统计 GCC 编译过程中各个阶段的时间&#xff0c;可以使用 GCC 的 -ftime-report 选项。这个选项可以让编译器在编译结束后报告每个编译阶段所花费的时间。要使用…