转载请在文章起始处注明出处,谢谢。
坑1、split的时候,NULL和''的区别
如果字符串最后的#没拼接数据:
select split('1#2###','#')
结果如下:
![](https://img.haomeiwen.com/i2312794/2b67d9fd2bcac9c9.png)
select split('1#2###','#')[2]
结果如下:
![](https://img.haomeiwen.com/i2312794/1292c024fbb02127.png)
如果字符串最后的#拼接数据:
select split('1#2###3','#')
结果如下:
![](https://img.haomeiwen.com/i2312794/659c75e6220bbf16.png)
select split('1#2###3','#')[2]
结果如下:
![](https://img.haomeiwen.com/i2312794/6a4e1539b4410cee.png)
神奇吧?
如果拼接符后面没有数据,才可以用is null;如果有数据,上报为''。
一劳永逸的解决办法为:split('字符串','#')[2] is null or split('字符串','#')[2] = '',或者 length(coalesce(split('字符串','#')[2],''))=0
坑2、在使用函数对拆分参数中的“数字”做处理的时候
比如用max函数处理拆分参数中的“数字”的时候:拆出来的参数是string格式,而max做处理的时候,需要传数字格式(如int,double)。故需要在拆出来的参数外套一层cast函数,否则结果会异常。
坑3、SQL中NULL不能进行如何的操作
若某表汇总的某列存在NULL则:
如NULL参与算术运算,则该算术表达式的值为null;例如:+,-,*,/ 加减乘除
如NULL参与比较运算,则结果为false;例如:>=,<=,<> 大于,小于,不等于
如果NULL参与聚集运算,则聚集函数都置为null;使用isnull(字段,0)等方式可以避免这种情况);除count(*), count(1), count(0)等之外(count(字段) 字段为null的行不参与计数)。
补充:
1.AVG()
求平均值
注意AVE()忽略NULL值,而不是将其作为“0”参与计算
2.COUNT()
两种用法
1、COUNT(*)
对表中行数进行计数
不管是否有NULL
2、COUNT(字段名)
对特定列有数据的行进行计数
忽略NULL值
3、MAX()、MIN()
求最大、最小值
忽略NULL
4、SUM()
可以对单个列求和,也可以对多个列运算后求和
忽略NULL值,且当对多个列运算求和时,如果运算的列中任意一列的值为NULL,则忽略这行的记录。
例如: SUM(A+B+C),A、B、C 为三列,如果某行记录中A列值为NULL,则不统计这行。
坑4、底层表存的url被encode,需要解码
![](https://img.haomeiwen.com/i2312794/1bfbfbb8f2efb7ed.png)
select reflect("java.net.URLDecoder", "decode", trim('参数'), "UTF-8")
结果:
![](https://img.haomeiwen.com/i2312794/b02fd297be3fd57b.png)
坑5、hive lateral view explode (array()) array为null
这个UDTF转换的Array为空的记录,自动被过滤掉了。用的时候注意一下,如果要保留记录,要把LATERAL VIEW explode转换成LATERAL VIEW OUTER explode,需要加上outer关键字。
![](https://img.haomeiwen.com/i2312794/059621fa8f10de89.png)
![](https://img.haomeiwen.com/i2312794/997923557021f7e5.png)
出现这个问题的情况,可以和坑1一块食用。
网友评论