千家信息网

hive WHERE语句的用法

发表于:2024-11-27 作者:千家信息网编辑
千家信息网最后更新 2024年11月27日,本篇内容介绍了"hive WHERE语句的用法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!WHER
千家信息网最后更新 2024年11月27日hive WHERE语句的用法

本篇内容介绍了"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语句的用法"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0