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);
        }
相关推荐
JosieBook17 小时前
【数据库】时序数据库通过国测认证,TimechoAI开放体验:工业数据的“存”与“智”如何协同?
数据库·时序数据库
2501_942389552 天前
特斯拉的车辆摄像头每四天为AI训练集采集的数据量
人工智能·hadoop·zookeeper·oracle·时序数据库·memcache
lbb 小魔仙3 天前
国家级_通行证_首发:拆解 DolphinDB 作为首批通过安可测评的时序数据库的四重底色
数据库·时序数据库
TDengine (老段)5 天前
TDengine TSMA — 时间维度的物化聚合视图
大数据·数据库·时序数据库·iot·tdengine·涛思数据
HZZD_HZZD6 天前
智慧能源SaaS架构实战,时序数据库选型对比
架构·能源·时序数据库
TDengine (老段)7 天前
# TDengine TMQ 最佳实践 — 可靠消费、容错与监控
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
2501_942389558 天前
小米寥寥几家车企设计汽车顶棚
华为·编辑器·时序数据库·harmonyos
A-刘晨阳9 天前
关键基础设施安全底座:自主可控时序大模型TimechoAI的国产化实践与深度时序分析能力
大数据·数据库·安全·时序数据库
TDengine (老段)1 个月前
TDengine 连接算子 — Inner/Outer/ASOF/Window Join 的实现与使用
大数据·数据库·物联网·哈希算法·时序数据库·tdengine·涛思数据
wuhanzhanhui1 个月前
9月22日-24日,2026武汉仪器仪表展会引领智能制造未来发展方向
制造·时序数据库