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

  1. hive> select * from t_pvorder where 1 != 1 and start_date=20130306 limit 1;
  2. OK
  3. Time taken: 0.079 seconds

带引号的数字和数字类型 可以用!= 比较:

[sql] view plain copy

  1. hive> select * from t_pvorder where "136258563267" != 0 and start_date=20130306 limit 1;
  2. OK
  3. 1323499396180741 13437046875509ec 0 102213 100002 01 -1 2013-03-06 20:59:07 1362574747440zW4 20130306
  4. Time taken: 0.169 seconds

带引号的数字和带引号数字类型 可以用 != 比较:

[sql] view plain copy

  1. hive> select * from t_pvorder where "136258563267" != "0" and start_date=20130306 limit 1;
  2. OK
  3. 1323499396180741 13437046875509ec 0 102213 100002 01 -1 2013-03-06 20:59:07 1362574747440zW4 20130306
  4. Time taken: 0.129 seconds

字符串和数字类型 不可以用 !=比较:

[sql] view plain copy

  1. hive> select * from t_pvorder where 0 != "1362585632671uFu" and start_date=20130306 limit 1;
  2. Total MapReduce jobs = 1
  3. Launching Job 1 out of 1
  4. Number of reduce tasks is set to 0 since there's no reduce operator
  5. //发起mapreduce 查不出结果
  6. ....

字符串和数字类型 不可以用 <> 比较:

[sql] view plain copy

  1. hive> select * from t_pvorder where 0 <> "1362585632671uFu" and start_date=20130306 limit 1;
  2. Total MapReduce jobs = 1
  3. Launching Job 1 out of 1
  4. Number of reduce tasks is set to 0 since there's no reduce operator
  5. //发起mapreduce <span style="font-family:Arial, Helvetica, sans-serif;">查不出结果</span>
  6. ....

总之,用不等于比较的时候两者的字段类型尽量保持一致。

3. 小于比较: <

语法: A < B

操作类型: 所有基本类型

描述: 如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A小于表达式B,则为TRUE;否则为FALSE

举例:

hive> select1 from lxw_dual where 1 < 2;

1

4. 小于等于比较: <=

语法: A <= B

操作类型: 所有基本类型

描述: 如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A小于或者等于表达式B,则为TRUE;否则为FALSE

举例:

hive> select1 from lxw_dual where 1 <= 1;

1

5. 大于比较: >

语法: A > 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,a<b,a>b,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$';

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

相关推荐