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);
        }
相关推荐
AC赳赳老秦1 天前
科研数据叙事:DeepSeek将实验数据转化为故事化分析框架
开发语言·人工智能·数据分析·r语言·时序数据库·big data·deepseek
涛思数据(TDengine)1 天前
陶建辉入选 2025 中国大数据产业年度趋势人物 · 十年先锋人物
时序数据库·tdengine·国产数据库
TDengine (老段)3 天前
TDengine 脱敏函数用户手册
大数据·服务器·数据库·物联网·时序数据库·iot·tdengine
砚边数影3 天前
时序数据库InfluxDB迁移替换实测,运维成本显著优化
运维·数据库·时序数据库·kingbase·kingbasees·金仓数据库
观远数据3 天前
中国式报表是什么?观远BI如何赋能企业数据决策
大数据·数据挖掘·数据分析·时序数据库
熊文豪4 天前
真实案例深度复盘:金仓时序数据库如何支撑海洋监测系统的数字化转型
数据库·时序数据库·金仓数据库·金仓时序数据库
一个天蝎座 白勺 程序猿4 天前
金仓数据库KingbaseES无缝替代MongoDB,实现核心业务系统平稳迁移
数据库·mongodb·架构·时序数据库·kingbasees
砚边数影4 天前
InfluxDB迁移替换实战:金仓时序数据库如何提高写入性能
数据库·性能优化·时序数据库·kingbase·kingbasees·金仓数据库
eWidget5 天前
InfluxDB迁移至金仓数据库的同城容灾实践:性能显著提升、运维效率优化,某能源企业实现RPO_5秒的高可靠时序数据管理
运维·数据库·能源·时序数据库·kingbase·kingbasees·金仓数据库
TDengine (老段)5 天前
使用安装包快速体验 TDengine TSDB
大数据·数据库·物联网·时序数据库·tdengine·涛思数据