Hive Sum(null)编译报错分析

业务需求需要使用hive统计积分point字段,不假思索写上了sum(point)的字段映射,造数null,空格串,空串,数字字符串,含有字母的数字串,结果符合预期。如图:

本以为是个简单的需求,CodeReview的时候,经理打电话问我sum里面的字段名为啥不加上coalesce排空?我说含null值的造数测试pass了,他反馈使用sum包含null的时候直接报错了,并给出了以下两个用例:

都是编译报错: Error while compiling statement: FAILED: UDFArgumentTypeException Only numeric or string type arguments are accepted but void is passed.

我记得Oracle的sum函数会自动忽略null啊,于是我又在sqlite3和MySQL上跑了一遍,都是OK的,如下图。

Kimi联网查询hive也是支持sum(null)的,甚至给出了·select sum(null)+1`的结果是null。。。这里本可以直接嵌套一层排空就结束了,但是这太奇怪了,难道是HQL的sum函数都得加上排空?但是造数的数据集里面有null也正常跑通了啊。

后面实验发现,给失败的数据集里面加个非null的数就能编译通过,如下图:

事情变得越来越有趣了。。。为啥有个非null的值就能正常编译通过呢。经验想不通的时候,回到SQL的底层工作原理上来,该SQL先对子查询求值,得到一个数据集,该数据集是一张表,在该表基础上执行sum操作。。。

此时合理猜想,该数据集是一张表,那么也就有字段类型了。如果一列只有null,我要是编译器的话我也会懵逼,数字型的字段可能是null,字符串也可能是null,那么解决方案是专门像Python一样整个None值还是标记成具体的类型呢。如果是专门整出一个Null类型那么是不会报错的,所以应该是后者,当查询里面有一个非Null的值,整列就标记为非null的类型。

为了验证这个猜想,分别执行了以下两个用例,仔细观察结果集标注的类型,一个是数字,一个是未知类型

确实数据集的类型不一样,猜想是可能成立的。为了进一步验证,基于以上猜想,提出以下用例:

①如果把sum里面的null转化成int,那么将编译通过

②CTAS建表是根据数据集的字段类型建表的,纯null列也会抛出报错

③trim函数也会和sum函数一样的表现。

④一张表字段类型已知,纯null列sum不会报错

经过实践,发现以上用例全部成立,猜想极大概率是成立的,从设计上来看select sum(null)并无多大实际意义,相当于是兼容标准SQL的sum函数对null的处理方式了。

相关推荐
ha_lydms1 小时前
AnalyticDB MySQL 技术架构
大数据·hadoop·mysql·adb·spark·dataworks·1024程序员节
莫叫石榴姐5 小时前
半导体业务数仓建模: Lot、Wafer、Die、Recipe、OEE、YMS 建模要点
数据仓库·sql·面试·职场和发展·矩阵·1024程序员节
螺蛳粉 螺蛳粉1 天前
大数据第四篇:事故复盘:移走 HBase 里 27 个 hadoop-2.10.2 jar 后,HMaster 半小时后“自杀“了【jar 事故复盘】
jvm·hadoop·hbase·异常处理·大数据运维·踩坑记录·事故复盘
java_logo2 天前
Docker 部署 Hue:轻松搭建数据库与数据仓库 SQL 查询平台
数据库·数据仓库·sql·docker·hue·部署教程·轩辕镜像
Francek Chen2 天前
【大数据处理与分析】数据仓库Hive:08 Impala
数据仓库·hive·hadoop·数据分析·impala
A smirK squirrel2 天前
Windows环境下Minio本地安装部署
数据仓库
ha_lydms3 天前
Window Functions(窗口函数)
大数据·数据仓库·hadoop·spark·数据处理·dataworks·maxcompute
geovindu3 天前
sql:Managing Complex Joins and Subqueries in SQL using mysql 9.0
大数据·数据库·数据仓库·sql·mysql·数据库开发·数据库架构
zhangzeyuaaa3 天前
StarRocks 的技术版图:在分析、检索与流处理之间找到位置
大数据·数据仓库