当前位置: 首页 > news >正文

influxdb2.0插入数据字段类型出现冲突问题解决

一、问题出现

一个学校换热站自控系统,会定时从换热站获取测点数据,并插入到influxdb数据库中。influxdb插入数据时,报错提示:

com.influxdb.exceptions.UnprocessableEntityException: failure writing points to database: partial write: field type conflict: input field "HuiYuanZhan.1500.Level_1_H" on measurement "HeatStationData" is type float, already exists as type string dropped=1

问题发生在名为 "HeatStationData" 的测量(measurement)上,其中字段 "HuiYuanZhan.1500.Level_1_H" 的数据类型存在冲突。这个字段在尝试写入时被识别为 float 类型,但它在数据库中已经存在,并且被定义为 string 类型。

InfluxDB 是一个时间序列数据库,它对每个测量中的字段类型有严格的要求。一旦一个字段被定义为某种类型(例如 string),后续写入的数据必须与该类型匹配。如果尝试将不同类型的数据写入同一个字段,InfluxDB 将拒绝写入并抛出错误。

二、查找原因

系统设计时,如果发生读取不到或者异常时,读取的空数据,也给了一个字符串的默认值"0.00",保证了哪怕时空数据也有个默认值,但是这与原来字段的数据类型float、integer、boolean等是不一致的。这个字符串的默认空值不知道为啥可以插入进去,有一段时间正好学校现场网络出现问题,导致系统无法读取到换热站的测点数据,数据库里存储了"0.00"的默认值。最近网络问题解决了,系统存取正常值时,报错无法插入了。

三、解决过程思路

1、把出现"0.00"默认值的,这一段时间的数据全部删除掉

influxdb并没有提供直接删除的flux语句,需要使用其他方法

  • bucket设置数据过期时间,操作范围是整个数据库的数据

  • 命令行界面CLI,使用delete命令删除(我使用的是这种方式)

通过命令操作influxdb时,先要验证权限,这里直接验证token

//权限 设置token:export INFLUX_TOKEN='iCmM46X2GKl2G3rPTtlKHFHljH8tDkWi-e1wpWh_76wlKQ2JDvAqhbhJZz5jdQN4a-iEHT08vSVL4z5S8yUPgw=='
influx delete --bucket autodata \--org auto \--start 2023-06-06T00:00:00Z \--stop 2024-03-07T15:16:01Z \--predicate '_measurement = "HeatStationData" and "tag" = "40" '
  • 访问api接口删除
http://127.0.0.1:8088/api/v2/delete?org=gg&bucket=autocontroldata&precision=s 
2、分析代码,找到赋值默认值的代码段,删除掉,改为读取不到数据时,不存储数据库,保证字段的数据类型一致。

问题代码:

for(int i=0;i<dataList.size();i++){Object value = dataList.get(i).getStatusCode().isBad() ? null : dataList.get(i).getValue().getValue();if(!(value instanceof Float)&&!(value instanceof Boolean)){if(value==null||value.equals(0)){value = "0.00";//System.out.println("float:" + value);}else{value = value+".00";//System.out.println("Integer-----------:" + value);}}
}

优化代码:opc读取的数据,除了常规数据类型,还有一种UShort数据类型,但在influxdb中是没有的,所以在获取到数据后,需要对这一类型先转化成integer类型。

                if(dataList.size()==nodeIdList.size()){for(int i=0;i<dataList.size();i++){/* Variant v = dataList.get(i).getValue();Optional<NodeId> dataType = v.getDataType();*/Object value = dataList.get(i).getStatusCode().isBad() ? null : dataList.get(i).getValue().getValue();if(value==null) {continue;}if(!(value instanceof Float)&&!(value instanceof Boolean)){if(value instanceof UShort){//UShort 转化成Integervalue = ((UShort) value).intValue();}}resultMap.put(nodeIdList.get(i),value);//System.out.println(resultMap.get("get"+nodeIdList.get(i)));}}

因为有的时候测点的值可能是0/1/2这样的整型,也可能是1.2/2.5之类的浮点型,这可能是同一个字段的值,但是系统读取到的值会判断为整型和浮点型,这也会导致同一字段存储两种不同类型的值,所以需要再把整型先转化成浮点型,统一全部浮点型存储,避免出现类型不一致情况

//转换数据类型 数值类型都为float---避免数据出现Integer和float的变化(一个字段只能有一种数据类型)Set set = map.keySet();for (Object o : set) {if(map.get(o) instanceof Integer){map.put((String)o,(int)map.get(o)* 1.0f);}}

插入数据

        try (WriteApi writeApi = influxDBClient.getWriteApi(writeOptions)) {//完整数据组装,包含数据库名称,索引,数据值集合,时间Point point = Point.measurement("HeatStationData").addTag("tag",  savetag).addFields(map).time(Instant.now(), WritePrecision.S);//单条记录保存writeApi.writePoint(bucket, org,point);}catch (Exception e){e.printStackTrace();System.out.println("=============插入数据异常============="+new Date()+":"+e.getMessage());}
3、删除异常数据类型的数据后,并没有用,插入还是失败,字段的数据类型已经被更改,最后选择迁移数据库,重新穿件新数据库,重新插入数据,将原有旧数据,想办法进行重新迁移

创建新的bucket:

项目配置文件更改要访问的bucket:

最终数据可以重新插入了

from(bucket: "autocontroldata") |> range(start:2024-02-10T05:40:09.000Z, stop:2024-04-12T05:40:57.000Z) |> filter(fn: (r) => r._measurement == "HeatStationData") |> filter(fn: (r) => r["tag"] == "39" or r["tag"] == "40" or r["tag"] == "41" or r["tag"] == "43" or r["tag"] == "47" )|> sort(columns:[ "_time"], desc: true) |> limit(n:10, offset: 1) 

四、总结

一定要避免同一字段中插入不同的数据类型,无论是读取不到数据时,给默认值还是整型和浮点型的类型统一。一定要在代码中做好此类问题的规避,避免再出现这种情况,导致数据无法插入,这种问题会对数据造成巨大损失。

相关文章:

influxdb2.0插入数据字段类型出现冲突问题解决

一、问题出现 一个学校换热站自控系统&#xff0c;会定时从换热站获取测点数据&#xff0c;并插入到influxdb数据库中。influxdb插入数据时&#xff0c;报错提示&#xff1a; com.influxdb.exceptions.UnprocessableEntityException: failure writing points to database: par…...

[C++]类和对象,explicit,static,友元,构造函数——喵喵要吃C嘎嘎4

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…...

物联网的商业模式洞察

大约在十年前&#xff08;2014年11月&#xff09;&#xff0c;全球知名管理思想家、哈佛商学院教授迈克尔波特与PTC前首席执行官吉姆赫普尔曼&#xff0c;在《哈佛商业评论》上联合撰写了一篇备受赞誉的文章&#xff0c;题为《智能互联产品如何改变竞争》。在这篇文章中&#x…...

智能指针基础知识【C++】【RAII思想 || unique_ptr || shared_ptrweak_ptr || 循环引用问题】

目录 一&#xff0c;为什么需要智能指针 二&#xff0c;内存泄露的基本认识 1. 内存泄露分类 2. 常见的内存检测工具 3&#xff0c;如何避免内存泄露 三&#xff0c;智能指针的使用与原理 1. RAII思想 2. 智能指针 &#xff08;1. unique_ptr &#xff08;2. shared_…...

leetcode:反转链表II 和k个一组反转链表的C++实现

反转链表II 问题描述 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 ListNode* reverseBetween(ListNode* head, int left, int right) {ListNode *…...

ERD Online 快速启动指南:代码下载到首次运行的全流程攻略 ️

&#x1f680; 一、代码下载 ERD online前端代码正常拉取即可&#x1f44c; 后端代码含有子模块&#xff0c;拉取命令如下&#xff1a; git clone --recurse-submodules https://github.com/www-zerocode-net-cn/martin-framework.git &#x1f6e0;️ 二、代码构建 &#x1f3…...

c++ 11 新特性 不同数据类型之间转换函数之const_cast

一.不同数据类型之间转换函数const_cast介绍 const_cast是C11中引入的一种类型转换操作符&#xff0c;用于修改类型的const或volatile属性。const_cast的主要用途是移除对象的常量性&#xff0c;它是唯一具有此能力的C风格的转型操作符。在C11中&#xff0c;const_cast可以完成…...

C++从零开始的打怪升级之路(day45)

这是关于一个普通双非本科大一学生的C的学习记录贴 在此前&#xff0c;我学了一点点C语言还有简单的数据结构&#xff0c;如果有小伙伴想和我一起学习的&#xff0c;可以私信我交流分享学习资料 那么开启正题 今天分享的是关于二叉树的题目 1.根据二叉树创建字符串 606. 根…...

小鹅通前端实习一面

总时长35分钟&#xff0c;自我介绍开始 1.js和c特点上的差异&#xff1b; 2.js数组去重 3.js的数据类型 4.js的引用类型和值类型的差别 5.讲一下js的网络请求 6.对前端三件套和框架的理解 7.一个html文档的结构是怎样的 8.head和body的区别 9.一个页面的加载顺序&#xff08;ht…...

ArrayList常用API

常见方法 add 增remove 删set 改get 查clear 清空元素size 长度isEmpty 为空判断 用法 // String就是泛型 这种使用方法对于限制类型很有用 ArrayList<String> arrayList new ArrayList<>();// add 添加元素 返回的是boolean 代表是否添加成功 arrayList.add(&qu…...

Chrome安装Axure插件

打开原型目录/resources/chrome&#xff0c;重命名axure-chrome-extension.crx&#xff0c;修改后缀为rar&#xff0c;axure-chrome-extension.rar 解压到axure-chrome-extension目录打开Chrome&#xff0c;更多工具->扩展程序&#xff0c;打开开发者模式&#xff0c;选择加…...

【AI+应用】模仿爆款视频二次创作短视频操作步骤

本来不想水这篇的&#xff0c; 剪辑软件估计很多人用的比我还6。 今天自己遇到1个需求&#xff0c;我看到一篇公众号文章的视频觉得有意思&#xff0c;但视频有点长&#xff0c;我没带耳机看视频的习惯&#xff0c;就想着能不能下载下来&#xff0c; 提取视频的音频转为文字&am…...

HTML使用

文章目录 一、简介二、HTML快速入门三、基础标签四、图片、音频、视频标签五、超链接标签六、列表标签七、表格标签八、布局标签九、表单标签十、表单向标签 一、简介 二、HTML快速入门 ​ <html><head><title>你好</title></head><body>再…...

通过联合部署DDoS高防和WAF提升网站防护能力

如果您的网站遭受的攻击既有流量型攻击&#xff0c;又混杂精巧的Web应用层攻击时&#xff08;例如SQL注入、跨站脚本攻击、命令注入等&#xff09;时&#xff0c;推荐您组合使用阿里云DDoS高防和Web 应用防火墙 WAF&#xff08;Web Application Firewall&#xff09;&#xff0…...

具体挫折现象的发生以及解法思考:您如果继续不问的话,严重重责就容易来

一 积极想方设法的寻找扭转劣势的方式方法&#xff1b;  目前对于第一条的践行&#xff0c;主要还是依靠打工做事赚取收入。至于个人业务&#xff0c;只能往后推&#xff0c;往后延迟。因为不管您目前居住的环境&#xff0c;还是个人条件都不行&#xff0c;所以无法实行个人业…...

Type-C接口PD协议统一:引领电子科技新纪元的优势解析

在电子科技日新月异的今天&#xff0c;充电接口的统一化已经成为了业界的一大趋势。其中&#xff0c;Type-C接口凭借其传输速度快、使用便捷等优点&#xff0c;迅速成为了市场上的主流选择。而PD&#xff08;Power Delivery&#xff09;协议的统一&#xff0c;更是为Type-C接口…...

探讨2024年AI辅助研发的趋势

一、引言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经成为当今时代最具变革性的技术之一。AI的广泛应用正在重塑各行各业&#xff0c;其中&#xff0c;AI辅助研发作为科技和工业领域的一大创新热点&#xff0c;正引领着研发模式的深刻变革。从医药…...

Java对接海康威视摄像头实现抓图

目录 一、下载SDK 二、拷贝示例代码 三、拷贝库文件 四、运行Demo 五、抓图业务 六、调参 ​七、发布Linux正式环境 一、下载SDK 海康开放平台 二、拷贝示例代码 三、拷贝库文件 这时候直接运行ClientDemo会报错&#xff0c;因为缺失库文件&#xff01; 四、运行Demo …...

浏览器一键重新发起请求

一、需求场景 在前端开发过程中&#xff0c;经常会需要重新请求后台进行代码调试&#xff0c;之前的常规方法是刷新浏览器页面或者点击页面进行交互&#xff0c;这样对多个请求的场景就很方便&#xff0c;但是往往很多时候我们只是单纯的想重新发起一个请求&#xff08;多个请求…...

一起来读李清照

当然先祝各位女生节日快乐&#x1f381;&#x1f381;啦​。​ 但是呢&#xff0c;今天&#xff0c;我们不聊技术&#xff0c;来聊点其他的。 大家都知道今天是三八妇女节&#xff0c;三八妇女节的是中国人的叫法&#xff0c;也叫国际妇女节。是为了纪念妇女权利的运动&#…...

数据关联性与趋势发现(使用千问)

数据关联性与趋势是数据洞察的核心&#xff0c;但人工分析需手动计算、绘制图表&#xff0c;且易受主观因素影响。千问可通过“数据建模模式识别”&#xff0c;自动挖掘数据间的隐藏关联&#xff0c;识别趋势类型与变化节点。实操框架与步骤如下&#xff1a;&#xff08;1&…...

微积分基本定理实战:5个常见积分上限函数求导案例解析

微积分基本定理实战&#xff1a;5个常见积分上限函数求导案例解析 在工程建模和物理问题分析中&#xff0c;积分上限函数的求导运算堪称"数学瑞士军刀"。想象一下&#xff0c;当你需要分析随时间变化的流量、计算变力做功或优化控制系统参数时&#xff0c;这个工具能…...

从鸟群到推荐系统:粒子群算法(PSO)在机器学习调参中的保姆级教程

从鸟群到推荐系统&#xff1a;粒子群算法(PSO)在机器学习调参中的保姆级教程 当你在训练XGBoost模型时&#xff0c;是否曾被那一长串超参数搞得头晕眼花&#xff1f;learning_rate该设0.1还是0.01&#xff1f;max_depth取6还是8更合适&#xff1f;传统网格搜索不仅耗时&#xf…...

集成学习方法解析:Bagging与Boosting原理与实践

1. 集成学习方法概述&#xff1a;为什么需要模型组合&#xff1f;在机器学习实践中&#xff0c;我们常常面临一个关键矛盾&#xff1a;单一模型往往难以同时满足高准确性和强泛化能力的需求。这就好比医疗诊断中&#xff0c;单个专家的意见可能受限于其专业背景&#xff0c;而多…...

CSS 背景图片无法加载的常见原因与正确写法详解

本文系统讲解 html 中 css 背景图片&#xff08;如 background-image: url(...)&#xff09;不显示的典型原因&#xff0c;包括路径错误、语法混用、属性书写不规范等问题&#xff0c;并提供可直接复用的标准写法与调试建议。 本文系统讲解 html 中 css 背景图片&#xff…...

浙江大学毕业论文LaTeX模板:学术写作的终极效率工具

浙江大学毕业论文LaTeX模板&#xff1a;学术写作的终极效率工具 【免费下载链接】zjuthesis Zhejiang University Graduation Thesis LaTeX Template 项目地址: https://gitcode.com/gh_mirrors/zj/zjuthesis 在浙江大学学术写作的旅途中&#xff0c;你是否曾为论文格式…...

python bcrypt

# 聊聊Python里的加密库&#xff1a;PyCryptodome 今天想和大家分享一个在Python加密领域里经常被用到的库&#xff0c;叫PyCryptodome。如果你在项目里处理过密码、加密文件或者设计过安全通信&#xff0c;很可能已经和它打过交道了。这个库表面上看起来只是一个工具集&#x…...

台达伺服PR模式调试避坑指南:从参数配置到故障排查(AL.013/AL.30报警解决)

台达伺服PR模式实战调试手册&#xff1a;参数配置与故障排查全解析 在工业自动化现场调试中&#xff0c;台达B3系列伺服驱动器的PR模式因其灵活的定位控制特性&#xff0c;成为许多设备制造商的首选方案。但实际应用中&#xff0c;工程师们常被电子齿轮比设置、软极限配置、报警…...

深入PyTorch源码:图解LayerNorm两种实现,弄懂weight/bias到底怎么来的

深入PyTorch源码&#xff1a;图解LayerNorm两种实现&#xff0c;弄懂weight/bias到底怎么来的 在深度学习模型的训练过程中&#xff0c;归一化技术扮演着至关重要的角色。不同于BatchNorm对批处理数据的标准化处理&#xff0c;LayerNorm&#xff08;层归一化&#xff09;因其在…...

短视频智能获客系统完整版:支持抖音/快手/视频号,含管理后台+手机端

温馨提示&#xff1a;文末有资源获取方式短视频赛道越来越卷&#xff0c;光靠人工剪辑发布已经跟不上节奏了。最近把一套能同时管理多个平台账号的系统跑通了&#xff0c;整理一下核心功能&#xff0c;给有需要的朋友参考。一、多平台统一管理支持抖音、快手、视频号、小红书、…...