您好,登錄后才能下訂單哦!
本篇內容介紹了“hive WHERE語句的用法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
WHERE語句
SELECT語句用于選取字段,WHERE語句用于過濾條件,兩者結合使用可以查找到符合過濾條件的記錄。之前我們已經在很多簡單例子中使用過它了,現在我們深入學習一下它吧。
WHERE語句使用謂詞表達式,對于列應用在謂詞操作符上的情況,稍后我們將進行討論。有幾種謂詞表達式可以使用AND和OR相連接。當謂詞表達式計算結果為true時,相應的行將被保留并輸出。
注:WHERE后面是不可以使用別名的,如果想使用別名,那可以使用嵌套語句去查詢。
1.謂詞操作符
下面這些謂詞操作符可以用于JOIN... ON和HAVING語句中。
操作符 | 支持的數據類型 | 描述 |
A=B | 基本數據類型 | 如果A等于B則返回TRUE,反之返回FLASE |
A<=>B | 基本數據類型 | 如果A和B都為NULL則返回TRUE,其他的和等號(=)操作符的結果一致,如果任一為NULL則結果為NULL |
A==B | 沒有 | 這個是錯誤的語法!SQL使用=,而不是== |
A<>B,A!=B | 基本數據類型 | A或者B為NULL則返回NULL;如果A不等于B則返回TRUE,反之返回FALSE |
A<=B | 基本數據類型 | A或者B為NULL則返回NULL;如果A小于或等于B則返回TRUE,反之返回FALSE |
A>B | 基本數據類型 | A或者B為NULL則返回NULL;如果A大于B則返回TRUE,反之返回FALSE |
A>=B | 基本數據類型 | A或者B為NULL則返回NULL;如果A大于或等于B則返回TRUE,反之返回FALSE |
A[NOT] BETWEEN B AND C | 基本數據類型 | 如果A,B或者C任一為NULL,則結果為NULL,如果A的值大于或等于B而且小于或等于C,則結果為TRUE,反之為FLASE。如果使用NOT關鍵字則可達到相反的效果 |
A IS NULL | 所有數據類型 | 如果A等于NULL則返回TRUE;反之返回FLASE |
A IS NOT NULL | 所有數據類型 | 如果A不等于NULL則返回TRUE;反之返回FLASE |
A [NOT] LIKE B | STRING 類型 | B是一個SQL下的簡單正則表達式,如果A與其匹配的話,則返回TRUE;反之返回FLASE。B的表達式說明如下:'x%'表示A必須以字母'x'開頭,'%x'表示A必須以字母'x'結尾,而'%x%'表示A包含有字母'x',可以位于開頭,結尾或者字符串中間。類似地,下劃線'_'匹配單個字符。B必須要和整個字符串A相匹配才行。如果使用NOT關鍵字則可達到相反的效果 |
A RLIKE B,A REGEXP B | STRING 類型 | B是一個正則表達式,如果A與其相匹配,則返回TRUE;反之返回FLASE。匹配使用的是JDK中的正則表達式接口實現的,因為正則規則也依據其中的規則。例如,正則表達式必須和整個字符串A想匹配,而不是只需與其子字符串匹配。 |
2.關于浮點數比較
浮點數比較的一個常見陷井出現在不同類型間做比較的時候(也就是FLOAT和DOUBLE比較)。
eg:下面這個對員工的查詢語句,該語句將返回員工姓名,工資和聯邦稅,過濾條件是薪水的減免稅款超過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嗎?這其實反映了內部是如何進行浮點數比較的,這個問題幾乎影響了在現在數字計算機中所有使用各種各樣編程語言編寫的軟件。
實際上我們可以說0.2對于FLOAT類型是0.2000001,而對于DOUBLE類型是0.200000000001。這是因為一個8字節的DOUBLE值具有更多的小數位。當表中的FLOAT值通過Hive轉換為DOUBLE值時,其產生的DOUBLE值是0.200000100000,這個值實際要比0.200000000001大。這就是為什么這個查詢結果像是使用了>=似的。
這個問題并非僅僅存在于Hive中或Java中,而其他系統也會出現這個問題。
Hive有兩種規避這個問題的方法。
1.如果使用存儲格式為TEXTFILE,那么Hive會從數據文件中讀取字符串"0.2",然后將其轉換成一個真實的數字。我們可以在表模式中定義對應的字段類型為DOUBLE而不是FLOAT,這樣我們就可以對deductions['Federal Taxes']這個DOUBLE值和0.2這個DOUBLE值進行比較。
2.使用cast操作符改變數據類型
eg:下面是修改后的語句和結果
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語句的用法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。