TOP

Hive中where 語句的“不等于”的陷阱
2018-12-06 17:01:54 】 瀏覽:1954
Tags:

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相等优乐棋牌app下载,則為TRUE;否則為FALSE

舉例:

hive>select 1 from lxw_dual where 1=1;

1

2.不等值比較: <>

語法: A <> B

操作類型: 所有基本類型

描述: 如果表達式A為NULL,或者表達式B為NULL优乐棋牌app下载,返回NULL;如果表達式A與表達式B不相等,則為TRUE;否則為FALSE

舉例:

hive> select1 from lxw_dual where 1 <> 2;

1


注意

由于在通常得SQL寫法中不等于也可以這樣寫 != 。但在hive中,當一個string類型和int類型比較的時候會出現問題。


數字和數字類型用可以用 !=比較:

[sql]
  1. hive>select*fromt_pvorderwhere1!=1andstart_date=20130306limit1;
  2. OK
  3. Timetaken:0.079seconds


帶引號的數字和數字類型可以用!=比較:

[sql]
  1. hive>select*fromt_pvorderwhere"136258563267"!=0andstart_date=20130306limit1;
  2. OK
  3. 132349939618074113437046875509ec010221310000201-12013-03-0620:59:071362574747440zW420130306
  4. Timetaken:0.169seconds


帶引號的數字和帶引號數字類型可以用 !=比較:

[sql]
  1. hive>select*fromt_pvorderwhere"136258563267"!="0"andstart_date=20130306limit1;
  2. OK
  3. 132349939618074113437046875509ec010221310000201-12013-03-0620:59:071362574747440zW420130306
  4. Timetaken:0.129seconds

字符串和數字類型不可以用 !=比較:

[sql]
  1. hive>select*fromt_pvorderwhere0!="1362585632671uFu"andstart_date=20130306limit1;
  2. TotalMapReducejobs=1
  3. LaunchingJob1outof1
  4. Numberofreducetasksissetto0sincethere'snoreduceoperator
  5. //發起mapreduce查不出結果
  6. ....


字符串和數字類型不可以用 <>比較:

[sql]
  1. hive>select*fromt_pvorderwhere0<>"1362585632671uFu"andstart_date=20130306limit1;
  2. TotalMapReducejobs=1
  3. LaunchingJob1outof1
  4. Numberofreducetasksissetto0sincethere'snoreduceoperator
  5. //發起mapreduce<spanstyle="font-family:Arial,Helvetica,sans-serif;">查不出結果</span>
  6. ....


總之,用不等于比較的時候兩者的字段類型盡量保持一致。


3.小于比較: <

語法: A < B

操作類型: 所有基本類型

描述: 如果表達式A為NULL,或者表達式B為NULL优乐棋牌app下载,返回NULL;如果表達式A小于表達式B,則為TRUE;否則為FALSE

舉例:

hive> select1 from lxw_dual where 1 < 2;

1

4.小于等于比較: <=

語法: A <= B

操作類型: 所有基本類型

描述: 如果表達式A為NULL,或者表達式B為NULL优乐棋牌app下载,返回NULL;如果表達式A小于或者等于表達式B,則為TRUE;否則為FALSE

舉例:

hive> select1 from lxw_dual where 1 <= 1;

1

5.大于比較: >

語法: A > B

操作類型: 所有基本類型

描述: 如果表達式A為NULL,或者表達式B為NULL优乐棋牌app下载,返回NULL;如果表達式A大于表達式B,則為TRUE;否則為FALSE

舉例:

hive> select1 from lxw_dual where 2 > 1;

1

6.大于等于比較: >=

語法: A >= B

操作類型: 所有基本類型

描述: 如果表達式A為NULL,或者表達式B為NULL优乐棋牌app下载,返回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 falsetrue 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 的正則語法优乐棋牌app下载,則為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


請關注公眾號獲取更多資料



】【打印繁體】【】【】 【】【】【】 【關閉】 【返回頂部
上一篇hive   之 in 能否使用子.. 下一篇Hive實戰   函數Find_in_set