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

相关推荐
WhoAmI18 小时前
MapReduce框架原理解析一:InputFormat
大数据·hadoop
WhoAmI18 小时前
MapReduce框架原理解析三:OutputFormat
大数据·hadoop
WhoAmI18 小时前
MapReduce框架原理解析二:Shuffle
大数据·hadoop
王小王-1236 天前
基于 Hive 的网易云音乐数据分析及可视化系统
hive·hadoop·数据分析·音乐数据分析·网易云音乐分析·hive音乐分析·hadoop网易云
极光代码工作室6 天前
基于数据仓库的电商数据分析平台
大数据·hadoop·python·spark·数据可视化
Database_Cool_6 天前
大规模数据分析降本指南:AnalyticDB Serverless 弹性架构实战
数据仓库·阿里云·架构·数据分析·serverless
Database_Cool_6 天前
什么是湖仓一体?和数据仓库的本质区别(附 AnalyticDB MySQL 湖仓一体方案)
数据库·数据仓库·mysql
Chris _data6 天前
WPF 学习第三天 — Modbus RTU 串口通信
hadoop·学习·wpf
知识分享小能手6 天前
Hadoop学习教程,从入门到精通,Flume日志采集系统 — 完整知识点与案例代码(9)
hadoop·学习·flume
递归尽头是星辰6 天前
AI 访问数据仓库:从直连到微服务化
数据仓库·人工智能·微服务·dataagent·ai数据治理