Apache IoTDB Rust客户端 v0.3.3 正式版发布
Apache IoTDB Rust 客户端 v0.3.3 正式版发布,同时也是第一个稳定版本,更新功能:
时区支持
- get_time_zone
- set_time_zone
存储组
- set_storage_group
- delete_storage_group
时间序列
- create_timeseries
- create_multi_timeseries
- delete_timeseries
数据写入
- insert_record
- insert_records_of_one_device
- insert_records
- insert_string_record
- insert_tablet
- insert_tablets
- delete_data
查询
- execute_statement
- execute_query_statemen
- execute_batch_statement
- execute_raw_data_query
- execute_update_statement
备注:iotdb-client-rs 贡献者 https://github.com/manlge ,同时也是 iotdb-client-go 的官方客户端贡献者
Apache IoTDB Client for Rust
概述
Apache IoTDB Rust 客户端
Apache IoTDB 官网: https://iotdb.apache.org
Apache IoTDB Github 仓库: https://github.com/apache/iotdb
预置项
apache-iotdb 0.12.0 或更新版本
快速开始使用:
使用
Put this in your Cargo.toml
:
[dependencies] iotdb-client-rs="0.3.3" chrono="0.4.19" prettytable-rs="0.8.0"
use std::vec; use chrono; use chrono::Local; use iotdb_client_rs::client::remote::{Config, RpcSession}; use iotdb_client_rs::client::{MeasurementSchema, Result, RowRecord, Session, Tablet, Value}; use iotdb_client_rs::protocal::{TSCompressionType, TSDataType, TSEncoding}; use prettytable::{cell, Row, Table}; fn main() { run().expect("failed to run session_example.") } fn run() -> Result<()> { let config = Config { host: String::from("127.0.0.1"), port: 6667, username: String::from("root"), password: String::from("root"), ..Default::default() }; let mut session = RpcSession::new(&config)?; session.open()?; let tz = session.get_time_zone()?; if tz != "Asia/Shanghai" { session.set_time_zone("Asia/Shanghai")?; } session.set_storage_group("root.ln1")?; session.delete_storage_group("root.ln1")?; session.set_storage_group("root.ln1")?; session.set_storage_group("root.ln2")?; session.delete_storage_groups(vec!["root.ln1", "root.ln2"])?; session.create_timeseries( "root.sg_rs.dev2.status", TSDataType::Float, TSEncoding::Plain, TSCompressionType::SNAPPY, None, None, None, None, )?; session.delete_timeseries(vec!["root.sg_rs.dev2.status"])?; session.insert_record( "root.sg_rs.dev5", vec!["online", "desc"], vec![Value::Bool(false), Value::Text("F4145".to_string())], Local::now().timestamp_millis(), false, )?; session.delete_timeseries(vec!["root.sg_rs.dev5.online", "root.sg_rs.dev5.desc"])?; session.insert_records( vec!["root.sg_rs.dev1"], vec![vec![ "restart_count", "tick_count", "price", "temperature", "description", "status", ]], vec![vec![ Value::Int32(1), Value::Int64(2018), Value::Double(1988.1), Value::Float(12.1), Value::Text("Test Device 1".to_string()), Value::Bool(false), ]], vec![Local::now().timestamp_millis()], )?; session.delete_timeseries(vec![ "root.sg_rs.dev1.restart_count", "root.sg_rs.dev1.tick_count", "root.sg_rs.dev1.price", "root.sg_rs.dev1.temperature", "root.sg_rs.dev1.description", "root.sg_rs.dev1.status", ])?; session.create_multi_timeseries( vec!["root.sg3.dev1.temperature", "root.sg3.dev1.desc"], vec![TSDataType::Float, TSDataType::Text], vec![TSEncoding::Plain, TSEncoding::Plain], vec![TSCompressionType::SNAPPY, TSCompressionType::SNAPPY], None, None, None, None, )?; session.delete_timeseries(vec!["root.sg3.dev1.temperature", "root.sg3.dev1.desc"])?; session.insert_string_record( "root.sg_rs.wf02.wt02", vec!["id", "location"], vec!["SN:001", "BeiJing"], Local::now().timestamp_millis(), false, )?; session.delete_timeseries(vec![ "root.sg_rs.wf02.wt02.id", "root.sg_rs.wf02.wt02.location", ])?; session.insert_records_of_one_device( "root.sg_rs.dev0", vec![ Local::now().timestamp_millis(), Local::now().timestamp_millis() - 1, ], vec![ vec!["restart_count", "tick_count", "price"], vec!["temperature", "description", "status"], ], vec![ vec![Value::Int32(1), Value::Int64(2018), Value::Double(1988.1)], vec![ Value::Float(36.8), Value::Text("thermograph".to_string()), Value::Bool(false), ], ], false, )?; let mut ts = Local::now().timestamp_millis(); let mut tablet1 = create_tablet(5, ts); tablet1.sort(); ts += 5; let mut tablet2 = create_tablet(10, ts); ts += 10; let mut tablet3 = create_tablet(2, ts); tablet1.sort(); session.insert_tablet(&tablet1)?; tablet2.sort(); tablet3.sort(); session.insert_tablets(vec![&tablet2, &tablet3])?; session.insert_records_of_one_device( "root.sg_rs.dev1", vec![1, 16], vec![vec!["status"], vec!["status"]], vec![vec![Value::Bool(true)], vec![Value::Bool(true)]], true, )?; session.delete_data(vec!["root.sg_rs.dev1.status"], 1, 16)?; let dataset = session.execute_query_statement("select * from root.sg_rs.device2", None)?; let mut table = Table::new(); table.set_titles(Row::new( dataset .get_column_names() .iter() .map(|c| cell!(c)) .collect(), )); dataset.for_each(|r: RowRecord| { table.add_row(Row::new( r.values.iter().map(|v: &Value| cell!(v)).collect(), )); }); table.printstd(); let dataset = session.execute_statement("show timeseries", None)?; let mut table = Table::new(); table.set_titles(Row::new( dataset .get_column_names() .iter() .map(|c| cell!(c)) .collect(), )); dataset.for_each(|r: RowRecord| { table.add_row(Row::new( r.values.iter().map(|v: &Value| cell!(v)).collect(), )); }); table.printstd(); session.execute_batch_statement(vec![ "insert into root.sg_rs.dev6(time,s5) values(1,true)", "insert into root.sg_rs.dev6(time,s5) values(2,true)", "insert into root.sg_rs.dev6(time,s5) values(3,true)", ])?; let dataset = session.execute_raw_data_query( vec![ "root.sg_rs.device2.restart_count", "root.sg_rs.device2.tick_count", "root.sg_rs.device2.description", ], 0, i64::MAX, )?; let mut table = Table::new(); table.set_titles(Row::new( dataset .get_column_names() .iter() .map(|c| cell!(c)) .collect(), )); dataset.for_each(|r: RowRecord| { table.add_row(Row::new( r.values.iter().map(|v: &Value| cell!(v)).collect(), )); }); table.printstd(); if let Some(dataset) = session.execute_update_statement("delete timeseries root.sg_rs.dev1.*")? { dataset.for_each(|r| println!("timestamp: {} {:?}", r.timestamp, r.values)); } session.close()?; Ok(()) } fn create_tablet(row_count: i32, start_timestamp: i64) -> Tablet { let mut tablet = Tablet::new( "root.sg_rs.device2", vec![ MeasurementSchema::new( String::from("status"), TSDataType::Boolean, TSEncoding::Plain, TSCompressionType::SNAPPY, None, ), MeasurementSchema::new( String::from("restart_count"), TSDataType::Int32, TSEncoding::RLE, TSCompressionType::SNAPPY, None, ), MeasurementSchema::new( String::from("tick_count"), TSDataType::Int64, TSEncoding::RLE, TSCompressionType::SNAPPY, None, ), MeasurementSchema::new( String::from("temperature"), TSDataType::Float, TSEncoding::Plain, TSCompressionType::SNAPPY, None, ), MeasurementSchema::new( String::from("price"), TSDataType::Double, TSEncoding::Gorilla, TSCompressionType::SNAPPY, None, ), MeasurementSchema::new( String::from("description"), TSDataType::Text, TSEncoding::Plain, TSCompressionType::SNAPPY, None, ), ], ); (0..row_count).for_each(|row| { let ts = start_timestamp + row as i64; tablet .add_row( vec![ Value::Bool(ts % 2 == 0), Value::Int32(row), Value::Int64(row as i64), Value::Float(row as f32 + 0.1), Value::Double(row as f64 + 0.2), Value::Text(format!("ts: {}", ts).to_string()), ], ts, ) .unwrap_or_else(|err| eprintln!("Add row failed, reason '{}'", err)); }); tablet }
下载:https://github.com/manlge/iotdb-client-rs/releases

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Weiit-saas 3.0 正式发布,开启新零售小程序电商时代。
Weiit-saas 3.0 数字商城和数字门店 saas 正式发布,开启新一代小程序电商时代。 从 2015 年开始,微信小程序/公众号开发受到开发者追捧,weiit团队重金研发产品《蜗店》,主要解决中小型企业快速接入微信生态实现电商场景化,主要产品竞争对手《有赞》、《微盟》。 因《蜗店》商业化过程中资金流周转出现问题,难以继续支持与迭代,现针对《蜗店》商业化产品开源,命名“weiit-saas”系统,weiit 团队拥有丰富的解决方案输出能力,开源 2.0 版本,供开发者学习与交流,欢迎志同道合的开发者同胞们继续完善,发奋创新与改良。在哪里跌倒,就在哪里站起来。 时隔一年,weiit 新版 saas3.0 系统 springboot 版本系统也正式上线,从底层架构到数据隔离和数据安全全面升级,UI界面更是焕然一新。给人眼前一亮的感觉。现在已正式上线,投入生产! weiit 提供 SaaS 数字商城和 SaaS 数字门店服务,帮助品牌商家打造商家自己的顾客资 产、通过碎片化数据计算、兼容与连接旧系统、全面提高精细化经营效率,让生意可持续性增长!助力企业实现数字化转型。 weiit 原...
- 下一篇
svnWebUI 1.0.5 发布,搭建 svn 服务器的神器
功能说明 svnWebUI是一款图形化管理服务端Subversion的配置得工具, 虽说现在已进入git的时代, 但svn依然有不少使用场景, 比如公司内的文档管理与共享, svn的概念比git的少很多, 非常适合非程序员使用. 但众所周知svn的Linux服务端软件即Subversion的用户和权限配置全部依靠手写配置文件完成, 非常繁琐且不便, 已有的几款图像界面软件已经非常古老, 安装麻烦而且依赖环境非常古老, 比如csvn还使用python2作为运行环境. Windows上倒是有不错的svn服务端软件即VisualSVN, 但一来Windows服务器少之又少, 第二VisualSVN没有web界面, 每次配置需要开启远程桌面, 安全性不高. 经历几次失败的图形界面配置后, 萌生了写一个现代svn服务端管理软件, 让svn的服务端管理有gitea的轻松体验的想法. 演示地址: http://svn.nginxwebui.cn:6060 用户名: admin 密码: admin 安装说明 1.安装java运行环境和Subversion Ubuntu: apt updat...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS8编译安装MySQL8.0.19
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS关闭SELinux安全模块
- 设置Eclipse缩进为4个空格,增强代码规范