时序数据库TSDB逐日统计的Jave算法实现过程

 

在文章《时序数据库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. 背景 万物互联,为数据创建价值;生活中,家用智能空调、智能扫地机器人、智能电视等等,物…