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;


......

总结

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

相关推荐
last_zhiyin24 分钟前
Oracle sql tuning guide 翻译 Part 6-4 --- Hint使用准则和Hint使用报告
数据库·sql·oracle·sql tunning
chenchihwen1 小时前
AI代码开发宝库系列:FAISS向量数据库
数据库·人工智能·python·faiss·1024程序员节
wending-Y1 小时前
如何正确理解flink 消费kafka时的watermark
flink·kafka·linq
小光学长2 小时前
基于Vue的课程达成度分析系统t84pzgwk(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
摇滚侠2 小时前
全面掌握PostgreSQL关系型数据库,备份和恢复,笔记46和笔记47
java·数据库·笔记·postgresql·1024程序员节
周杰伦fans2 小时前
Navicat - 连接 mysql 、 sqlserver 数据库 步骤与问题解决
数据库·mysql·sqlserver
码以致用3 小时前
StarRocks笔记
数据库·starrocks·olap·1024程序员节
auspicious航4 小时前
PostgreSQL数据库关于pg_rewind的认识
数据库·postgresql·oracle
武子康4 小时前
Java-159 MongoDB 副本集容器化 10 分钟速查卡|keyfile + –auth + 幂等 init 附 docker-compose
java·数据库·mongodb·docker·性能优化·nosql·1024程序员节
zz-zjx4 小时前
MySQL 索引深度指南:原理 · 实践 · 运维(适配 MySQL 8.4 LTS)
运维·数据库·mysql