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的处理方式了。

相关推荐
YMatrix 官方技术社区2 小时前
美国·硅谷|YMatrix 即将亮相 Postgres Conference 2026,前瞻 AI 时代的数据基座
数据库·数据仓库·postgresql·时序数据库·ymatrix
孟意昶6 小时前
Doris专题31-SQL手册-基础元素
大数据·数据库·数据仓库·分布式·sql·知识图谱·doris
juniperhan10 小时前
Flink 系列第12篇:Flink 维表关联详解
大数据·数据仓库·分布式·flink
Leo.yuan13 小时前
告别DataX和Kettle:FineDataLink如何实现数据同步+ETL+治理一体化?
数据仓库·etl
Roselind_Yi15 小时前
云计算实验实操|Hadoop伪分布式部署+MapReduce编程实践(超详细图文版)
大数据·hadoop·经验分享·笔记·分布式·数据挖掘·云计算
hINs IONN3 天前
深入解析HDFS:定义、架构、原理、应用场景及常用命令
hadoop·hdfs·架构
隐于花海,等待花开3 天前
Hive 常用函数详细总结
数据仓库·hive·hadoop
孟意昶3 天前
Doris专题28-聚合多维分析
大数据·数据库·数据仓库·sql·doris
docsz4 天前
据数据基座搭建
大数据·hadoop
RestCloud4 天前
流式优先数据架构:从批量ETL到事件驱动架构的演进之路
数据仓库·etl·cdc·数据处理·数据集成·数据传输·数据同步