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 (老段)11 小时前
TDengine STMT2 API 使用指南
java·大数据·物联网·时序数据库·iot·tdengine·涛思数据
时序数据说2 天前
为什么时序数据库IoTDB选择Java作为开发语言
java·大数据·开发语言·数据库·物联网·时序数据库·iotdb
TDengine (老段)2 天前
使用 StatsD 向 TDengine 写入
java·大数据·数据库·时序数据库·iot·tdengine·涛思数据
myskybeyond2 天前
时序数据库TDEngine安装和使用
服务器·时序数据库·tdengine
时序数据说2 天前
时序数据库IoTDB用户自定义函数(UDF)使用指南
大数据·数据库·物联网·开源·时序数据库·iotdb
时序数据说3 天前
Java类加载机制及关于时序数据库IoTDB排查
java·大数据·数据库·物联网·时序数据库·iotdb
时序数据说13 天前
时序数据库IoTDB数据导入与查询功能详解
大数据·数据库·开源·时序数据库·iotdb
TDengine (老段)13 天前
TDengine 3.3.5.0 新功能——服务端查询内存管控
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
TDengine (老段)14 天前
使用 Telegraf 向 TDengine 写入数据
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
时序数据说14 天前
时序数据库双存储引擎技术解析
大数据·数据库·物联网·开源·时序数据库·iotdb