Hive中where 语句的“不等于”的陷阱

您所在的位置:网站首页 hive中关联条件like能用吗 Hive中where 语句的“不等于”的陷阱

Hive中where 语句的“不等于”的陷阱

2024-07-13 13:32| 来源: 网络整理| 查看: 265

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