Hive中where 语句的“不等于”的陷阱 |
您所在的位置:网站首页 › hive中关联条件like能用吗 › Hive中where 语句的“不等于”的陷阱 |
hive 中‘不等于’不管是用! 或者符号实现,都会将空值即null过滤掉,此时要用 where (white_level'3' or white_level is null) 或者 where (white_level!='3' or white_level is null ) 来保留null 的情况。以下知识点来源于:https://blog.csdn.net/liuj2511981/article/details/8702047 1. 等值比较: =语法:A=B 操作类型:所有基本类型 描述: 如果表达式A与表达式B相等,则为TRUE;否则为FALSE 举例: hive>select 1 from lxw_dual where 1=1; 1 2. 不等值比较:语法: A B 操作类型: 所有基本类型 描述: 如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A与表达式B不相等,则为TRUE;否则为FALSE 举例: hive> select1 from lxw_dual where 1 2; 1 注意: 由于在通常得SQL写法中不等于也可以这样写 != 。但在hive中,当一个string类型和int类型比较的时候会出现问题。 数字和数字类型用 可以用 != 比较: [sql] view plain copy hive> select * from t_pvorder where 1 != 1 and start_date=20130306 limit 1; OK Time taken: 0.079 seconds带引号的数字和数字类型 可以用!= 比较: [sql] view plain copy hive> select * from t_pvorder where "136258563267" != 0 and start_date=20130306 limit 1; OK 1323499396180741 13437046875509ec 0 102213 100002 01 -1 2013-03-06 20:59:07 1362574747440zW4 20130306 Time taken: 0.169 seconds带引号的数字和带引号数字类型 可以用 != 比较: [sql] view plain copy hive> select * from t_pvorder where "136258563267" != "0" and start_date=20130306 limit 1; OK 1323499396180741 13437046875509ec 0 102213 100002 01 -1 2013-03-06 20:59:07 1362574747440zW4 20130306 Time taken: 0.129 seconds字符串和数字类型 不可以用 !=比较: [sql] view plain copy hive> select * from t_pvorder where 0 != "1362585632671uFu" and start_date=20130306 limit 1; Total MapReduce jobs = 1 Launching Job 1 out of 1 Number of reduce tasks is set to 0 since there's no reduce operator //发起mapreduce 查不出结果 ....字符串和数字类型 不可以用 比较: [sql] view plain copy hive> select * from t_pvorder where 0 "1362585632671uFu" and start_date=20130306 limit 1; Total MapReduce jobs = 1 Launching Job 1 out of 1 Number of reduce tasks is set to 0 since there's no reduce operator //发起mapreduce 查不出结果 ....总之,用不等于比较的时候两者的字段类型尽量保持一致。 3. 小于比较: select1 from lxw_dual where 1 < 2;1 4. 小于等于比较: B 操作类型: 所有基本类型 描述: 如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A大于表达式B,则为TRUE;否则为FALSE 举例: hive> select1 from lxw_dual where 2 > 1; 1 6. 大于等于比较: >= 语法: A >= B 操作类型: 所有基本类型 描述: 如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A大于或者等于表达式B,则为TRUE;否则为FALSE 举例: hive> select1 from lxw_dual where 1 >= 1; 1
注意:String的比较要注意(常用的时间比较可以先to_date之后再比较) hive> select* from lxw_dual; OK 201111120900:00:00 2011111209
hive> selecta,b,ab,a=b from lxw_dual; 201111120900:00:00 2011111209 false true false 7. 空值判断: IS NULL 语法: A IS NULL 操作类型: 所有类型 描述: 如果表达式A的值为NULL,则为TRUE;否则为FALSE 举例: hive> select1 from lxw_dual where null is null; 1 8. 非空判断: IS NOTNULL 语法: A IS NOT NULL 操作类型: 所有类型 描述: 如果表达式A的值为NULL,则为FALSE;否则为TRUE 举例: hive> select1 from lxw_dual where 1 is not null; 1 9. LIKE比较: LIKE 语法: A LIKE B 操作类型: strings 描述: 如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合表达式B 的正则语法,则为TRUE;否则为FALSE。B中字符”_”表示任意单个字符,而字符”%”表示任意数量的字符。 举例: hive> select1 from lxw_dual where 'football' like 'foot%'; 1 hive> select1 from lxw_dual where 'football' like 'foot____'; 1 注意:否定比较时候用NOT ALIKE B hive> select1 from lxw_dual where NOT 'football' like 'fff%'; 1 10. JAVA的LIKE操作: RLIKE 语法: A RLIKE B 操作类型: strings 描述: 如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合JAVA正则表达式B的正则语法,则为TRUE;否则为FALSE。 举例: hive> select1 from lxw_dual where 'footbar’ rlike '^f.*r$’; 1 注意:判断一个字符串是否全为数字: hive>select 1from lxw_dual where '123456' rlike '^\\d+$'; 1 hive> select1 from lxw_dual where '123456aa' rlike '^\\d+$'; 11. REGEXP操作: REGEXP 语法: A REGEXP B 操作类型: strings 描述: 功能与RLIKE相同 举例: hive> select1 from lxw_dual where 'footbar' REGEXP '^f.*r$'; 1 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |