一直以来spark社区是非常活跃的开源社区,版本跟新迭代速度相当的快。有的时候大版本更新时间速度快到怀疑人生,第一次感觉到学习速度跟不上更新速度,是在spark1.6更新到spark2.0,两个版本几乎没有间隔多久。也一度怀疑自己已经老了,吃不动这碗饭了。
回归正题,spark官方版本更新速度比较快本身是一件很好的事情,能够快速修复已经提交的bug,新的性能优化方案和技术方向可以很快在新版本上得到实现。在向下兼容性上做的也很好,小版本之间在API上基本上没有什么很大的变更。但是,还是会有漏网之鱼,让你在满心欢喜的升级spark版本过程中,给你沉重一击。导致在旧版本上正常运行的代码,在新版本上直接无法运行。由于spark开源社区的严谨性,这种bug真的是可遇而不可求,碰到一个这样的bug并且解决掉,让一件非常有趣的事情。今天讲述的这个bug就是这一类问题。
今天我们讲述的这个bug是和UDF和UDAF相关的一个spark版本差异导致的bug。
众所周知,在scala开发过程中数据结构Map的key是可以为空的,但是在spark SQL中的数据结构Map是不能为空的。如果在spark SQL中数据结构Map的key为空,在计算过程会提示如下错误:
java.lang.RuntimeException: Cannot use null as map key
这个提示能够很容易,让开发者定位到bug位置以及引起bug的原因。
但是在如下场景中就不会又这么友好的提示:
1.Spark UDF 返回Map类型,其中map的key包含null
2.Spark UDAF 其中bufferSchema或者返回结果为Map类型,其中map的key出现null