Hive return code 2以及concat与concat_ws的区别

(作者:陈玓玏data-master.net)

一、 Return code 2错误

用hive跑数的时候,常会碰到一个错误:

FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask

关于这个错误,网上有挺多解决方法的,有说将引擎换成Tez的,这个我试过,似乎没成功,有的人成功了。说明这个return code 2的根本原因可能是不一样的。有说是数据量的问题的,这种情况我也碰到过,就是join了一个超大的表,并且主键还很多重复的,造成了数据爆炸,把那个join的过程去掉之后,问题就解决了。

关于这个错误,最靠谱的说法还是:**这个错误其实不是最本质的错误,需要去查看日志才行的。**下面说一个我查日志查出来的bug,年代久远,日志截图没保存,只能说是在hadoop web ui上面查的,聪明的你一定知道怎么查日志。

二、 Concat_ws和concat

这个具体的问题就是,我在做特征工程的时候,用了concat(A,B)这样的函数+str_to_map来做同中间表上不同的衍生逻辑生成多个特征的操作。这个操作在hive里总是给我报错return code 2,但是在spark-sql里面竟然不报错

这个原因我查了半天(一开始不懂看日志,用spark-sql就这么稀里糊涂地跑了结果)。然后,检查结果数据的时候,问题就暴露出来了。比如,我的基础表里面,明明有数据A,但是没有数据B,那么我所希望的concat(A,B)的结果是AB这样的形式,结果spark-sql跑出来的是空。这时候我才想起去看看hive日志里报的错,它的意思是:concat不能有空值。恍然大悟,hive在concat处理到空值的时候,选择报错,spark-sql则默认结果为空值了。因此,关键的问题就是处理concat里面空值的问题。

最终,我采用的是把concat(A,B)换成concat_ws(‘’,A,B),concat_ws可以处理空值,最终A存在B为空的这种情况,结果是我所期望的A,而不再是空。

所以啊,两个结论:

  1. return code 2还是得去查hive日志,不能因为有时候spark-sql不报错就不管哦。
  2. 另一个,如果要拼接的元素里有可能有空值,推荐用concat_ws而不是concat哦。

希望大家的代码都少少bug~

你可能感兴趣的:(大数据)