CASE WHEN对NULL值的处理规则及Spark中MEAN函数的NULL行处理问询
嘿,我来帮你解答这两个Spark SQL相关的问题:
1. CASE WHEN THEN如何处理NULL值?
其实CASE WHEN对NULL值的处理逻辑很清晰,主要分这几种场景:
- 当
WHEN的判断条件涉及NULL时,要注意:NULL和任何值做比较(包括和自身比较= NULL)的结果都是NULL,而CASE只会匹配结果为TRUE的分支。所以如果是CASE WHEN col IS NULL THEN '处理空值' ELSE '非空' END,这种写法能正确匹配col为NULL的情况;但要是写成CASE WHEN col = NULL THEN ...,这个条件永远不会被匹配,最后会走到ELSE(没写ELSE就返回NULL)。 - 如果
THEN后面的表达式结果是NULL,那整个CASE表达式的结果就是NULL。比如CASE WHEN col1 = 'A' THEN col2 END,当col2是NULL时,这个CASE的结果直接是NULL。 - 如果没有任何
WHEN分支被匹配,同时又没写ELSE子句,那CASE表达式默认返回NULL。
2. 关于Spark SELECT中MEAN函数结合CASE的疑问
先把你提到的SQL片段贴出来:
MEAN(CASE WHEN (col1 = 'A' AND (col3 = 'A' OR col4 = 'B')) THEN col2 END) AS testing
针对你的问题,答案很明确:
当col2为NULL时,这个CASE表达式的结果就是NULL;而Spark的MEAN()函数(和AVG()完全等价)在计算平均值时,会自动忽略所有的NULL值。
具体拆解下逻辑:
- 只有满足
(col1 = 'A' AND (col3 = 'A' OR col4 = 'B'))条件的行,才会触发CASE的THEN分支;如果这些行里的col2是NULL,CASE返回NULL,这个值会被MEAN直接跳过,不参与平均值计算。 - 那些不满足条件的行,CASE表达式因为没有ELSE分支,默认返回NULL,同样会被MEAN忽略。
- 最终
testing的结果,是所有满足条件且col2不为NULL的行中,col2值的平均值。如果满足条件的行里col2全是NULL,或者根本没有满足条件的行,MEAN会返回NULL。
内容的提问来源于stack exchange,提问作者Tokyo
相关产品推荐
相关产品推荐

