InfluxDB2的数据查询示例

有用influxdb2 不支持sql,并且实质是个列存储数据库,这里基于

复制代码
influxdb-client-java 和 beanutils反射,写了个数据查询,把结果以行对象的形式返回的工具类。
java 复制代码
package com.joy.malltools.influxdb2;

import com.influxdb.client.QueryApi;
import com.influxdb.query.FluxRecord;
import com.influxdb.query.FluxTable;
import org.apache.commons.beanutils.PropertyUtils;

import java.util.List;
import java.util.Map;

/**
 * 对应influxDB2的查询结果的处理
 */
public class InfluxDB2Util2 {

    /**
     *
     * @param clz 类型
     * @param queryApi 待转换的查询集合
     * @param sql influxdb2的查询语句
     * @param extStrColumns 额外的String类型的字段名,一般为tag
     * @return clz类型的对象数组
     * @param <T>
     */
    public static <T> T[] testStatSql(Class<T> clz, QueryApi queryApi, String sql, String[] extStrColumns) {
        System.out.println(sql);
        List<FluxTable> query = queryApi.query(sql);
        int count = query.get(0).getRecords().size();
        System.out.println("记录条数.size " + count);
        T[] vos = (T[]) java.lang.reflect.Array.newInstance(clz, count);
        for (int k = 0; k < count; k++) {
            try {
                vos[k] = clz.newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        for (int i=0;i<query.size();i++) {
            FluxTable fluxTable = query.get(i);
            System.out.println("records.size " + fluxTable.getRecords().size());
            List<FluxRecord> recordList = fluxTable.getRecords();
            for (int j=0;j<recordList.size();j++) {
                FluxRecord fr = recordList.get(j);
                System.out.println("时间  " + fr.getTime() + "  求记录数 " + fr.getValue());
                System.out.println("时间  " + fr.getTime() + "  字段名 " + fr.getField() +  " measurement " + fr.getMeasurement());
                Map<String, Object> valueMap = fr.getValues();
                System.out.print("key : " + valueMap.get("_field") + " ; value " + valueMap.get("_value") + "|");
                try {
                    PropertyUtils.setProperty(vos[j], valueMap.get("_field")+"", valueMap.get("_value"));
                } catch (Exception e) {
                    e.printStackTrace();
                }
                if (extStrColumns != null && extStrColumns.length > 0)
                for (String colStr : extStrColumns) {
                    setProperty(vos[j], colStr, fr.getValueByKey(colStr)+"");
                }
//                setProperty(vos[j], "location", fr.getValueByKey("location")+"");
//                setProperty(vos[j], "description", fr.getValueByKey("description")+"");
            }
            System.out.println("");

        }
        System.out.println("数据集合 --> ");
        for (Object vo: vos) {
            System.out.println("vo --> " + vo);
        }
        return vos;
    }

    private static void setProperty(Object obj, String fieldName, String value) {
        try {
            PropertyUtils.setProperty(obj, fieldName, value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

主要依赖的jar

XML 复制代码
 <dependency>
            <groupId>com.influxdb</groupId>
            <artifactId>influxdb-client-java</artifactId>
            <version>6.5.0</version>
        </dependency>
 <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.4</version>
        </dependency>

调用示例

java 复制代码
String sql = "from(bucket: \"test\")\n" +
                "  |> range(start: -3d)\n" +
                "  |> filter(fn: (r) => r[\"_measurement\"] == \"h2o_feet\" )\n" +
                "  |> yield(name: \"mean\")";
        InfluxDBClient influxDBClient = InfluxDBClientFactory.create(url,token.toCharArray(),org,bucket);
        QueryApi queryApi = influxDBClient.getQueryApi();
        String[] strColAry = new String[]{"location", "description"};
        WaterVO[] objs = InfluxDB2Util2.testStatSql(WaterVO.class, queryApi, sql, strColAry);

        System.out.println("<-- ---------------- vo ----------------  --> ");
        for (WaterVO vo: objs) {
            System.out.println("vo --> "+vo);
        }
相关推荐
涛思数据(TDengine)14 小时前
TDengine 与 SCADA 强强联合:提升工业数据管理的效率与精准
大数据·时序数据库·tdengine
涛思数据(TDengine)4 天前
替换 Oracle ,江河信息用 TDengine 解决高基数查询写入问题
大数据·时序数据库·tdengine
涛思数据(TDengine)4 天前
TDengine 与飞腾腾锐 D2000 完成兼容互认证,推动国产软硬件深度融合
大数据·时序数据库·tdengine
张狂年少5 天前
【三】TDengine 3.3.2 生产级别集群搭建
大数据·时序数据库·tdengine
程序者王大川6 天前
【物联网】时序数据库InfluxDB解析及1.x版本与2.x版本区别详解
java·数据库·物联网·数据采集·时序数据库·数据·工业互联网平台
程序者王大川6 天前
【物联网】深入解析时序数据库TDengine及其Java应用实践
java·大数据·数据库·物联网·时序数据库·tdengine
DolphinDB智臾科技8 天前
视频回放 | DolphinDB 2024 年度峰会主会场演讲精彩回顾
数据分析·时序数据库·实时计算·量化金融
张狂年少13 天前
【二】TDEngine快速入门
大数据·时序数据库·tdengine
Apache IoTDB13 天前
时序数据库 IoTDB 为什么选择 TPCx-IoT 基准测评?
数据库·物联网·时序数据库·iotdb
IT邦德18 天前
时序数据库荣登巅峰,被央视报道了!
数据库·时序数据库