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

相关推荐
B站计算机毕业设计超人12 天前
计算机毕业设计Django+Vue.js高考推荐系统 高考可视化 大数据毕业设计(源码+LW文档+PPT+详细讲解)
大数据·vue.js·hadoop·django·毕业设计·课程设计·推荐算法
B站计算机毕业设计超人12 天前
计算机毕业设计Django+Vue.js音乐推荐系统 音乐可视化 大数据毕业设计 (源码+文档+PPT+讲解)
大数据·vue.js·hadoop·python·spark·django·课程设计
十月南城12 天前
数据湖技术对比——Iceberg、Hudi、Delta的表格格式与维护策略
大数据·数据库·数据仓库·hive·hadoop·spark
王九思12 天前
Hive Thrift Server 介绍
数据仓库·hive·hadoop
土拨鼠烧电路12 天前
笔记11:数据中台:不是数据仓库,是业务能力复用的引擎
数据仓库·笔记
Asher050912 天前
Hive核心知识:从基础到实战全解析
数据仓库·hive·hadoop
xhaoDream12 天前
Hive3.1.3 配置 Tez 引擎
大数据·hive·tez
yumgpkpm12 天前
AI视频生成:Wan 2.2(阿里通义万相)在华为昇腾下的部署?
人工智能·hadoop·elasticsearch·zookeeper·flink·kafka·cloudera
Asher050912 天前
Hadoop核心技术与实战指南
大数据·hadoop·分布式