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;


......

总结

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

相关推荐
Database_Cool_10 小时前
向量检索加速首选:阿里云 Tair 内置向量能力毫秒级召回
数据库·阿里云
强健的石头11 小时前
django文件对象是什么?
数据库·django·sqlite
ClouGence11 小时前
保障公共安全,一线治安机构实时数据应用与实践
数据库·mysql·postgresql
烟漠河洛12 小时前
线上事故复盘:Redis幂等性设计边界没覆盖跨状态请求,订单状态机直接崩了
数据库·redis·缓存
Minxinbb12 小时前
TDSQL for MySQL 服务器重启操作
数据库·mysql·dba
SelectDB12 小时前
Doris 实战:用 Colocate Join 消除 Shuffle,AB 指标计算性能提升 145 倍 🚀
数据库·性能优化·ab测试
PawSQL12 小时前
PawSQL 技术月报 | 2026年6月
数据库·sql·tdsql·pawsql·sql审核
TTBIGDATA12 小时前
【Ambari Plus】12.Flink 安装
hive·hadoop·flink·ambari·hdp·cdh·bigtop
SelectDB12 小时前
Apache Doris 在 AgentLogsBench 中领先,支撑 Agent 可观测性生产负载
运维·数据库·agent
聚美智数13 小时前
黄历查询-运势查询-国际法定节假日查询-API接口介绍
android·java·数据库