Hive运行报空指针异常--Hive与SparkSQL的小差异

在一次执行代码的过程中,SparkSQL 执行正常的代码,放到 Hive 中执行直接抛出空指针异常。查询了一些网上资料,大部分都是回答分区表没有分区,union 时候数据类型不一致。也不知道是直接抄袭还是同一个人的博客。但是检查了自己的代码,排除了分区以及union 过程中出现问题,但是仍然认为是数据类型造成的可能性极大。

通过仔细的排查,发现有一行代码是这样的:

nvl(table2.cityintime,array(0)) as cityintime

这行代码中,cityintime 字段的类型实际上是array 类型,用来存储时间戳。 但是如果匹配不上,我是直接赋值给一个默认的数组。一个bigint 类型的array,我给了一个int 类型,这样难道不可以?毕竟 bigint 包含了 int 呀! 而且使用SparkSQL 已经运行了好久了!

为了验证我的想法,我新建了一张表,里面的data 字段使用 array 类型。执行下面的插入代码

insert into test.test002 values(array(3332));

明显这条语句类型是不对的。但是,SparkSQL 可以成功插入,而 Hive 则会报错,无法插入。

查询也是如此

select nvl(data,array(0)) from test.test002 ;

Hive 是无法这样查询的,而 SparkSQL 却可以正常查询。

看来Hive 和 SparkSQL 语法上虽然已经很相近了,但是内部还是有些差异。要防止踩坑。

你可能感兴趣的:(spark,hive)