Flink SQL因类型错误导致MAX和MIN计算错误

背景

最近在做数据分析,用Flink SQL来做分析工具,因数据源的数据存在不太规范的数据格式,因此我需要通过SQL函数把我需要的数据值从VARCHAR类型的字段中把数据提取出来,然后再做MAX、MIN、SUM这些统计。怎料SUM算出来的结果准确无误,而MAX和MIN算出来的结果却始终不正确,最后发现原来是我用SQL函数提取VARCHAR类型的字段的数据,也是VARCHAR类型,所以导致MAX、MIN结果不正确,后面转成DOUBLE类型之后结果正确。

示例

源数据

|---------|-----------|----------|
| user_id | user_name | integral |
| 1 | 张一 | 100,150 |
| 2 | 张二 | 100,150 |
| 3 | 张三 | 50,30 |
| 4 | 张四 | 20,50 |

假设源数据有这一张表,字段分别表示用户ID、用户名和积分,积分字段是使用逗号分隔的两个内容值,第一个是普通积分,第二个是VIP积分,需要分析所有用户中最小的普通积分和最大的VIP积分。

分析SQL

错误的SQL

sql 复制代码
......


--SPLIT_INDEX(`integral`,',',0) 返回的是一个VARCHAR,所以这里计算的结果为50
SELECT MAX(SPLIT_INDEX(`integral`,',',0)) AS common_integral_max

FROM user_table ;


--SPLIT_INDEX(`integral`,',',0) 返回的是一个VARCHAR,所以这里计算的结果为150
SELECT MIN(SPLIT_INDEX(`integral`,',',0)) AS vip_integral_min 

FROM user_table;


......

正确的SQL

sql 复制代码
......


--SPLIT_INDEX(`integral`,',',0) 返回的是一个VARCHAR,将其转为DOUBLE后,计算结果为100
SELECT MAX(CAST(SPLIT_INDEX(`integral`,',',0) AS DOUBLE)) AS common_integral_max

FROM user_table ;


--SPLIT_INDEX(`integral`,',',0) 返回的是一个VARCHAR,将其转为DOUBLE后,计算结果为30
SELECT MIN(CAST(SPLIT_INDEX(`integral`,',',0) AS DOUBLE)) AS vip_integral_min 

FROM user_table;


......

总结

结合我上面踩的坑,我觉得以后设计表结构的时候,应该让字段的类型与实际存储的数据类型相匹配,同时代码中定义数据结构体时,类型也需要与实际的数据类型一致,这样可以减少在做数据处理的时候的数据转换。

相关推荐
zzzzzz3106 小时前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
倔强的石头_2 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
云技纵横2 天前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
冬奇Lab3 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
ClouGence3 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
无响应de神3 天前
三、用户与权限管理
数据库·mysql
麦聪聊数据4 天前
数据服务化时代:企业数据能力输出的核心路径
数据库
shushangyun_4 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
DARLING Zero two♡4 天前
【MySQL数据库】数据类型与表约束
数据库·mysql
曹牧4 天前
Oracle EXPLAIN PLAN
数据库·oracle