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

相关推荐
段一凡-华北理工大学4 小时前
工业领域的Hadoop架构学习~系列文章08:Flink流处理引擎
人工智能·hadoop·学习·架构·flink·高炉炼铁·高炉炼铁智能化
段一凡-华北理工大学5 小时前
工业领域的Hadoop架构学习~系列文章07:Spark内存计算引擎
大数据·人工智能·hadoop·学习·架构·高炉炼铁·高炉炼铁智能化
RestCloud19 小时前
从架构师视角看ETL工具选型:如何构建可演进的数据集成平台
数据仓库·etl·cdc·数据处理·数据传输·elt
卷毛迷你猪1 天前
快速实验篇(A3)基于 Hive 的气象数据数仓构建与干旱指标初步分析
大数据·hadoop·分布式
卷毛迷你猪1 天前
快速实验篇(A4)Hive 数据仓库进阶:全站点干旱事件识别与多维统计分析
数据仓库·hive·hadoop·分布式
冰上浮云1 天前
Gravitino iceberg catalog backend 为hive 获取元数据过程
数据仓库·hive·hadoop·gravitino
段一凡-华北理工大学1 天前
工业领域的Hadoop架构学习~系列文章06:Hive数据仓库
数据仓库·hadoop·架构·高炉炼铁·工业智能体·高炉智能化·hive数据仓库
zgl_200537792 天前
源代码:跨数据库通用SQL语法解析与标注拆解
大数据·数据库·数据仓库·sql·etl·源代码管理
暴躁小师兄数据学院2 天前
【AI大数据工程师特训笔记】第13讲:数据库性能手术刀
大数据·数据库·数据仓库·sql·postgresql
段一凡-华北理工大学2 天前
工业领域的Hadoop架构学习~系列文章04:YARN资源调度架构
人工智能·hadoop·学习·架构·系统架构·高炉炼铁·高炉炼铁智能化