今天帮后端同学写个hive语句,看了一眼数据格式之后,以为是嵌套的json结构,于是用later view json_tuple() 来解析,然后一直在抛出输入参数不是String类型的异常,觉得很奇怪,于是检查了一遍表的数据结构,发现不是json的结构,json结构里面key与value都是包含有\的,只是单纯的struct嵌套map的结构,struct直接读取就可以,map用map['key']取就可以,舍近求远了。
后来发现问题的原因是hive在显示Array,Map,Struct结构时,都会以JSON的格式进行显示,并且真正的读取null字段时,如果读取的字段不存在,是会返回null的,并不会真正的抛出参数不匹配的异常。
任务跑成功之后,任务长时间不执行reduce,同事说是数据倾斜,但是后来一想,我的hive语句中不包含任何需要reduce的操作,应该不会导致数据倾斜。
并且任务中设置了参数:set hive.groupby.skewindata=true;
深入了解了一下,需要reduce的常用操作有count(distinct colmn),groupBy,join;这三个操作数据分布不均都会对任务执行造成影响。orderBy也有reduce,但是数据倾斜不会造成影响,因为orderBy都是最后聚合到一个reduce task中执行。