溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

hive WHERE語(yǔ)句的用法

發(fā)布時(shí)間:2021-07-28 20:56:28 來(lái)源:億速云 閱讀:356 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“hive WHERE語(yǔ)句的用法”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!


WHERE語(yǔ)句

      SELECT語(yǔ)句用于選取字段,WHERE語(yǔ)句用于過(guò)濾條件,兩者結(jié)合使用可以查找到符合過(guò)濾條件的記錄。之前我們已經(jīng)在很多簡(jiǎn)單例子中使用過(guò)它了,現(xiàn)在我們深入學(xué)習(xí)一下它吧。

      WHERE語(yǔ)句使用謂詞表達(dá)式,對(duì)于列應(yīng)用在謂詞操作符上的情況,稍后我們將進(jìn)行討論。有幾種謂詞表達(dá)式可以使用AND和OR相連接。當(dāng)謂詞表達(dá)式計(jì)算結(jié)果為true時(shí),相應(yīng)的行將被保留并輸出。

      注:WHERE后面是不可以使用別名的,如果想使用別名,那可以使用嵌套語(yǔ)句去查詢。

1.謂詞操作符

下面這些謂詞操作符可以用于JOIN... ON和HAVING語(yǔ)句中。


操作符

支持的數(shù)據(jù)類型

描述

A=B

基本數(shù)據(jù)類型

如果A等于B則返回TRUE,反之返回FLASE

A<=>B

基本數(shù)據(jù)類型

如果A和B都為NULL則返回TRUE,其他的和等號(hào)(=)操作符的結(jié)果一致,如果任一為NULL則結(jié)果為NULL

A==B

沒(méi)有

這個(gè)是錯(cuò)誤的語(yǔ)法!SQL使用=,而不是==

A<>B,A!=B

基本數(shù)據(jù)類型

A或者B為NULL則返回NULL;如果A不等于B則返回TRUE,反之返回FALSE

A<=B

基本數(shù)據(jù)類型

A或者B為NULL則返回NULL;如果A小于或等于B則返回TRUE,反之返回FALSE

A>B

基本數(shù)據(jù)類型

A或者B為NULL則返回NULL;如果A大于B則返回TRUE,反之返回FALSE

A>=B

基本數(shù)據(jù)類型

A或者B為NULL則返回NULL;如果A大于或等于B則返回TRUE,反之返回FALSE

A[NOT] BETWEEN B AND C

基本數(shù)據(jù)類型

如果A,B或者C任一為NULL,則結(jié)果為NULL,如果A的值大于或等于B而且小于或等于C,則結(jié)果為TRUE,反之為FLASE。如果使用NOT關(guān)鍵字則可達(dá)到相反的效果

A IS NULL

所有數(shù)據(jù)類型

如果A等于NULL則返回TRUE;反之返回FLASE

A IS NOT NULL

所有數(shù)據(jù)類型

如果A不等于NULL則返回TRUE;反之返回FLASE

A [NOT] LIKE B

STRING 類型

B是一個(gè)SQL下的簡(jiǎn)單正則表達(dá)式,如果A與其匹配的話,則返回TRUE;反之返回FLASE。B的表達(dá)式說(shuō)明如下:'x%'表示A必須以字母'x'開(kāi)頭,'%x'表示A必須以字母'x'結(jié)尾,而'%x%'表示A包含有字母'x',可以位于開(kāi)頭,結(jié)尾或者字符串中間。類似地,下劃線'_'匹配單個(gè)字符。B必須要和整個(gè)字符串A相匹配才行。如果使用NOT關(guān)鍵字則可達(dá)到相反的效果

A RLIKE B,A REGEXP B

STRING 類型

B是一個(gè)正則表達(dá)式,如果A與其相匹配,則返回TRUE;反之返回FLASE。匹配使用的是JDK中的正則表達(dá)式接口實(shí)現(xiàn)的,因?yàn)檎齽t規(guī)則也依據(jù)其中的規(guī)則。例如,正則表達(dá)式必須和整個(gè)字符串A想匹配,而不是只需與其子字符串匹配。

2.關(guān)于浮點(diǎn)數(shù)比較

       浮點(diǎn)數(shù)比較的一個(gè)常見(jiàn)陷井出現(xiàn)在不同類型間做比較的時(shí)候(也就是FLOAT和DOUBLE比較)。

       eg:下面這個(gè)對(duì)員工的查詢語(yǔ)句,該語(yǔ)句將返回員工姓名,工資和聯(lián)邦稅,過(guò)濾條件是薪水的減免稅款超過(guò)0.2(之前定義的deductions的map的值是FLOAT類型的)

hive> SELECT name,salary,deductions['Federal Taxes']
    > FROM employees WHERE deductions['Federal Taxes']>0.2;
John    Doe    100000.0    0.2
Mary    Smith    80000.0    0.2
Boss    Man    200000.0    0.3
Fred    Finance    150000.0    0.3
 


Wait!為什么deductions['Federal Taxes']=0.2的記錄也被輸出了?

        這是Hive的Bug嗎?這其實(shí)反映了內(nèi)部是如何進(jìn)行浮點(diǎn)數(shù)比較的,這個(gè)問(wèn)題幾乎影響了在現(xiàn)在數(shù)字計(jì)算機(jī)中所有使用各種各樣編程語(yǔ)言編寫的軟件。

實(shí)際上我們可以說(shuō)0.2對(duì)于FLOAT類型是0.2000001,而對(duì)于DOUBLE類型是0.200000000001。這是因?yàn)橐粋€(gè)8字節(jié)的DOUBLE值具有更多的小數(shù)位。當(dāng)表中的FLOAT值通過(guò)Hive轉(zhuǎn)換為DOUBLE值時(shí),其產(chǎn)生的DOUBLE值是0.200000100000,這個(gè)值實(shí)際要比0.200000000001大。這就是為什么這個(gè)查詢結(jié)果像是使用了>=似的。

        這個(gè)問(wèn)題并非僅僅存在于Hive中或Java中,而其他系統(tǒng)也會(huì)出現(xiàn)這個(gè)問(wèn)題。

        

Hive有兩種規(guī)避這個(gè)問(wèn)題的方法。

1.如果使用存儲(chǔ)格式為TEXTFILE,那么Hive會(huì)從數(shù)據(jù)文件中讀取字符串"0.2",然后將其轉(zhuǎn)換成一個(gè)真實(shí)的數(shù)字。我們可以在表模式中定義對(duì)應(yīng)的字段類型為DOUBLE而不是FLOAT,這樣我們就可以對(duì)deductions['Federal Taxes']這個(gè)DOUBLE值和0.2這個(gè)DOUBLE值進(jìn)行比較。

2.使用cast操作符改變數(shù)據(jù)類型

          eg:下面是修改后的語(yǔ)句和結(jié)果

hive> SELECT name,salary,deductions['Federal Taxes']
                 > FROM employees WHERE deductions['Federal Taxes']>cast(0.2 AS FLOAT);
Boss    Man    200000.0    0.3
Fred    Finance    150000.0    0.3

“hive WHERE語(yǔ)句的用法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI