WTM+InfluxDB时序数据库数据查询并放到DataTable中
2023-03-31 10:56:08 时间
一、需求描述
由于WTM默认只支持查询关系型数据库,但实际生产过程中,我们的数据可能会存在时序数据库。
WTM LayUI的架构下,实现通过查询InfluxDB时序数据库数据,并将数据放到DataTable中。
二、解决思路
通过Influx语法,将数据查询出来放到List的容器中,然后再在GetSearchQuery方法中返回。 这样无论查询数据放到DataTable还是导出都可以使用。
三、代码实现
GetSearchQuery方法的实现:
public override IOrderedQueryable<HParameterMonitoring_View> GetSearchQuery() { var list= GetInfluxDBData().Result; return list.AsQueryable().OrderBy(x=>x.HParameterMonitoring_MachineCode); }
查询InfluxDB数据将其放到List容器中:
private async Task<List<HParameterMonitoring_View>> GetInfluxDBData() { StringBuilder query = new StringBuilder(); StringBuilder queryCount = new StringBuilder(); string machineId = Searcher.SelectedMachineId.ToString(); var dicParm = DC.Set<CMachParm>().CheckContain(Searcher.HPTHAlarmParameterIds, x => x.ID).ToDictionary(s => s.NameEN, v => v); // List<string> paraList = dicParm.Keys.ToList(); List<ParamName> paraList = new List<ParamName>(); foreach (var para in dicParm) { ParamName obj = new ParamName() { Name_Cn = para.Value.NameCN, Name_En = para.Value.NameEN, Unit = para.Value.Unit, }; paraList.Add(obj); }; int queryStart = DateHelper.ConvertDateTimeInt(Searcher.DateStart ?? DateTime.Now.AddMinutes(-5)); int queryEnd = DateHelper.ConvertDateTimeInt(Searcher.DateEnd ?? DateTime.Now); List<HParameterMonitoring_View> objList = new List<HParameterMonitoring_View>(); using (var client = InfluxDBClientFactory.Create(Wtm.ConfigInfo.AppSettings["InfluxDBUrl"], Wtm.ConfigInfo.AppSettings["InfluxDBToken"].ToCharArray())) { client.EnableGzip();//此方法将数据压缩,就不会导致超时的发生 //bool IsGzipEnabled=client.IsGzipEnabled(); query.Append($"from(bucket:"{Wtm.ConfigInfo.AppSettings["InfluxDBBucket"]}")"); query.Append($@"|> range(start: {queryStart},stop:{queryEnd})"); query.Append("|> filter(fn: (r) => r["_measurement"] == "cncinfo")"); query.Append($"|> filter(fn: (r) => r["machineId"] == "{machineId}")"); if (paraList.Count > 0) { query.Append($"|> filter(fn: (r) => 1!=1");//or 就要是false 因为false或什么 就是什么 foreach (var para in paraList) { query.Append($" or r["_field"] == "{para.Name_En}"");//相当于select那些列 } query.Append(")"); } var fluxTable = await client.GetQueryApi().QueryAsync(query.ToString(), Wtm.ConfigInfo.AppSettings["InfluxDBOrg"],cancellationToken:System.Threading.CancellationToken.None); //int z = (Searcher.Page - 1) * Searcher.Limit; for (int i = 0; i < fluxTable.Count; i++) {//i是参数 for (int j = 0; j < fluxTable[i].Records.Count; j++) {//j是数据 string time = fluxTable[i].Records[j].GetTimeInDateTime()?.AddHours(8).ToString("yyyy-MM-dd HH:mm:ss"); string fieldOri = fluxTable[i].Records[j].GetField(); Dictionary<string, object> values = fluxTable[i].Records[j].Values; string NameCn = ""; string Unit = ""; foreach (var item in paraList) { if (item.Name_En == fieldOri) { NameCn = item.Name_Cn; Unit = item.Unit; } }; HParameterMonitoring_View obj = new HParameterMonitoring_View() { HParameterMonitoring_MachineCode = values["eqname"]?.ToString(), HParameterMonitoring_Param = fieldOri, HParameterMonitoring_ParamCn = NameCn, HParameterMonitoring_Value = values["_value"]?.ToString() + Unit, HParameterMonitoring_UpdateTime = time, }; objList.Add(obj); } } }; return objList; }
四、改善建议
改善点1:每次查询出来都是不带分页的整个list,然后才进行分页
由于要使用WTM的GetSearchQuery,而WTM的分页和排序是在执行完GetSearchQuery方法之后,故没法分页查询。如果要分页查询,只能自己写查询数据库方法不使用GetSearchQuery方法,而是在查询时序数据库的时候,直接用limit进行分页。
相关文章
- 从本体论开始说起——运营商关系图谱的构建及应用
- 如何成为一名数据科学家?
- 从未见过的堂兄杀了人,你的DNA是关键证据
- 20个安全可靠的免费数据源,各领域数据任你挑
- 20个安全可靠的免费数据源,各领域数据任你挑
- 阿里云李飞飞:All in Cloud时代,云原生数据库优势明显
- 基于Hadoop生态系统的一高性能数据存储格式CarbonData(性能篇)
- 大数据告诉你:10年漫威,到底有多少角色
- TigerGraph:实时图数据库助力金融风控升级
- Splunk利用Splunk Connected Experiences和Splunk Business Flow 扩大数据访问
- 大数据开发常见的9种数据分析手段
- 以免在景区看人,我爬了5W条全国景点门票数据...
- 【实战解析】基于HBase的大数据存储在京东的应用场景
- 数据科学家告诉你哪些计算机科学书籍是你应该看的
- Kafka作为大数据的核心技术,你了解多少?
- Spring Boot 整合 Redis 实现缓存操作
- 大数据学习必须掌握的五大核心技术有哪些?
- 基于Antlr在Apache Flink中实现监控规则DSL化的探索实践
- 甲骨文再次被Gartner评为分析型数据管理解决方案魔力象限领导者
- 爬取吴亦凡微博102118条转发数据,扒一扒流量的真假