在文章《时序数据库TSDB按时间进行数量统计算法研究》中,给出了对存入TSDB的数据逐日进行统计的算法。今天介绍一下算法的具体实现代码(java):
注意,本本中用到的tsdb的数据查询操作见文章
《物联网平台搭建的全过程介绍(六)——物联网TSDB之基本知识及读写代码介绍》
和《阿里云TSDB如何获取metric设定时间段内最早的value值?》
目录
一、依赖
二、声明变量
三、声明类
1、时间格式类
四、函数
1、数据库连接函数
2、从当天24点逆序查询数据库中最新一条数据函数
3、获得当天24点时间函数
4、时间转换为时间戳函数
5、搜索一年内数据库中每天24点最后一条数据的线程
6、在Handler中统计每天的数量
一、依赖
implementation 'com.aliyun:hitsdb-client:0.2.7'
二、声明变量
TSDB tsdbClient;
String str_metric="TB";//metric 标签名
int firstday;//从当前天数开始计算,从0开始逆序计数,数据库中有数据存入的最早的日期的序号
int int_day_last_count[366];//每天24点前最后一条数据
int int_day_count[365];//每天的数量
String str_day_last;//从数据中查询到的24点前的最后一条数据,字符串格式
long oneday=86400000;
三、声明类
1、时间格式类
SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.getDefault());
四、函数
1、数据库连接函数
//tsdb联网
public void Query_tsdb_link() throws Exception {
//联网地址、端口、账号、密码存在string文件中
String tsdb_url= getText(R.string.tsdb_url).toString();
int tsdb_port= Integer.parseInt(getText(R.string.tsdb_port).toString());
String tsdb_name= getText(R.string.tsdb_name).toString();
String tsdb_passwd= getText(R.string.tsdb_passwd).toString();
final TSDBConfig config = TSDBConfig.address(tsdb_url, tsdb_port)
.basicAuth(tsdb_name, tsdb_passwd)
// 网络连接池大小,默认为64。
.httpConnectionPool(128)
// HTTP 等待时间,单位为秒,默认为90秒。
.httpConnectTimeout(90)
// IO 线程数,默认为1。
.ioThreadCount(1)
.config();
tsdbClient = TSDBClientFactory.connect(config);
}
2、从当天24点逆序查询数据库中最新一条数据函数
//从tsdb获取最新数据
public String Query_tsdb_day_last(String deviceno,String Metric,long myStamp_curDate) throws Exception {
final String str_value;
//按标签筛选数据。
Map tags = new HashMap();
tags.put("deviceName",deviceno);
String metric = Metric;
LastPointQuery query = LastPointQuery.builder()
.timestamp(myStamp_curDate)
.backScan(0)
.msResolution(true)
.sub(LastPointSubQuery.builder(metric, tags).build()).build();
List lastDataValues = tsdbClient.queryLast(query);
if (lastDataValues.size()!=0){
str_value=lastDataValues.get(0).getValue().toString();
} else {
str_value ="empty";
}
System.out.println(lastDataValues);
return str_value;
}
3、获得当天24点时间函数
//获得当天24点时间
public static long getTimesnight(){
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 24);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.MILLISECOND, 0);
return (int) (cal.getTimeInMillis()/1000);
}
4、时间转换为时间戳函数
/**
* 时间转换成时间戳,参数是字符串,返回值是长整形
* @param s
* @return res
* @throws ParseException
*/
@SuppressLint("SimpleDateFormat")
public static long dateToStamp(String s) throws ParseException {
String res;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date date = simpleDateFormat.parse(s);
long ts = date.getTime();
return ts;
}
5、搜索一年内数据库中每天24点最后一条数据的线程
new Thread(new Runnable() {
@Override
public void run() {
try {
Query_tsdb_link();//连接数据库
boolean Search_Stop=false;//搜素停止标志,如果从某个时间点逆序搜索最后一条数据为空,说明此时间点之前没有数据存入
int i=0;//统计天数序号,逆序,当天为0
//数据库中没有存入数据之前的日期不再搜索
while(!Search_Stop) {
Date curDate = new Date(getTimesnight() * 1000 - (i) * oneday);//获得统计时间段内所有日期的24点时间
String str_curDate = format.format(curDate);//调整日期格式
long myStamp_curDate = dateToStamp(str_curDate);//转化为时间戳格式
str_day_last_count = Query_tsdb_day_last(SelectedBoxNo, str_metric, myStamp_curDate);//搜索某个设备对应metric 和tag的24点前最后一条数据
//如果搜素为空,则搜索当天24点至次日24点之间的第一条数据,把这条数据做为当天24前的第一条数据
if (day_last_count.equals("empty")) {
Query query = Query.timeRange(myStamp_curDate, myStamp_curDate + oneday)
.sub(SubQuery.metric(str_metric).aggregator(Aggregator.NONE).tag("deviceName", SelectedBoxNo).build()).build();
List result = tsdbClient.query(query);
String rs = result.get(0).getDps().values().iterator().next().toString();
int_day_last_count[firstday] = Math.round(Float.parseFloat((rs)));
Search_Stop=true;
} else {
int_day_last_count[i] = Math.round(Float.parseFloat(day_last_count));
}
firstday = i;//记录数据库中有数据的最早日期序数
i++;
//统计时间上限为365天
if(i>365)
{Search_Stop=true;}
}
Query_finish_bundle=true;
mHandler.sendEmptyMessage(0);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
6、在Handler中统计每天的数量
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
for(int i=0;i
(全文结束)
本文章来源于互联网,如有侵权,请联系删除!原文地址:时序数据库TSDB逐日统计的Jave算法实现过程
物联网物模型 1. 背景 2. 物模型类别 2.1 ICA 2.2 OneDataModel 2.3 3IM(AII-DTML) 2.4 电力模型规范 3.物模型思考 1. 背景 万物互联,为数据创建价值;生活中,家用智能空调、智能扫地机器人、智能电视等等,物…