目录
[二、hive 运算符分类](#二、hive 运算符分类)
[三、hive 运算符操作演示](#三、hive 运算符操作演示)
[3.1 数据准备](#3.1 数据准备)
[3.2 关系运算符](#3.2 关系运算符)
[is null空值判断](#is null空值判断)
[is not null 非空值判断](#is not null 非空值判断)
[3.3 算术运算符](#3.3 算术运算符)
[取余操作: %](#取余操作: %)
[位与操作: &](#位与操作: &)
[位或操作: |](#位或操作: |)
[位异或操作: ^](#位异或操作: ^)
[3.4 逻辑运算符](#3.4 逻辑运算符)
[与操作: A AND B](#与操作: A AND B)
[或操作: A OR B](#或操作: A OR B)
[非操作: NOT A 、!A](#非操作: NOT A 、!A)
[在:A IN (val1, val2, ...)](#在:A IN (val1, val2, ...))
[不在:A NOT IN (val1, val2, ...)](#不在:A NOT IN (val1, val2, ...))
[逻辑是否存在: [NOT] EXISTS (subquery)](#逻辑是否存在: [NOT] EXISTS (subquery))
[3.5 其他运算符](#3.5 其他运算符)
一、前言
在很多编程语言中都需要运算符去完成一些常规的或复杂的算数运算、逻辑运算等,比如mysql,java,nginx的shell等等,运算符的使用可以让程序和业务变得简单,具备更好的灵活性,本篇将详细介绍下hive中的运算符的使用。
二、hive 运算符分类
Hive支持的运算符可以分为三大类:
- 关系运算符;
- 算术运算符;
- 逻辑运算符;
官方参考文档:官方运算符地址 ,或者使用下面的命令查看hive系统的相关运算符或函数:
-- 1、显示所有的函数和运算符
show functions;
-- 2、查看运算符或者函数的使用说明
describe function count;
-- 3、使用extended 可以查看更加详细的使用说明
describe function extended count;
如下截取了当前版本下hive的部分运算符

三、hive 运算符操作演示
理论是枯燥的,下面通过实际操作来演示下各类运算符的详细使用吧;
3.1 数据准备
在Hive中创建一个空表dual,用于测试各种运算符的功能;
创建表dual
sql
create table dual(id string);

加载一个文件dual.txt到dual表中
dual.txt只有一行内容:内容为一个空格
load data local inpath '/usr/local/soft/hivedata/dual.txt' into table dual;
执行上面的加载命令

模拟测试
select 1+1 from dual;

3.2 关系运算符
关系运算符属于hive的内置运算符,是二元运算符,执行的是两个操作数的比较运算,每个关系运算符都返回boolean类型结果(TRUE或FALSE);
以下是常规的关系运算符:
|-------------|-------------|
| 运算符含义 | 表达式 |
| 等值比较 | = 、== |
| 不等值比较 | <> 、!= |
| 小于比较 | < |
| 小于等于比较 | <= |
| 大于比较 | > |
| 大于等于比较 | >= |
| 空值判断 | IS NULL |
| 非空判断 | IS NOT NULL |
| LIKE比较 | LIKE |
| JAVA的LIKE操作 | RLIKE |
| REGEXP操作 | REGEXP |
is null空值判断
select 1 from dual where 'congge' is null;

is not null 非空值判断
select 1 from dual where 'congge' is not null;

like使用
- _表示任意单个字符
- %表示任意数量字符;
- 否定比较: NOT A like B;
like单个字符比较
select 1 from dual where 'congge' like 'co_';
可以看到这种情况下没有匹配到结果

%任意数量字符匹配
select 1 from dual where 'congge' like 'co%';
这个有点像mysql中的like模糊匹配

like否定比较
select 'abcde' like 'abc';
select not 'abcde' like 'abc';

rlike
确定字符串是否匹配正则表达式,是REGEXP_LIKE()的同义词;
select 1 from dual where 'congge' rlike '^c.*e$';
select 1 from dual where '123456' rlike '^\\d+$'; --判断是否全为数字
select 1 from dual where '123456aa' rlike '^\\d+$';

如果是匹配开始c结尾为e,则能匹配到结果

regexp
功能与rlike相同 用于判断字符串是否匹配正则表达式
select 1 from dual where 'congge' regexp '^c.*e$';

3.3 算术运算符
算术运算符操作数必须是数值类型。 分为一元运算符和二元运算符:
- 一元运算符,只有一个操作数;
- 二元运算符有两个操作数,运算符在两个操作数之间;
常用算术运算符:
|-----------|----------|
| 运算符含义 | 表达式 |
| 加减乘除操作 | + - * / |
| 取整操作 | div |
| 取余操作 | % |
| 位与操作 | & |
| 位或操作 | | |
| 位异或操作 | ^ |
| 位取反操作 | ~ |
取整操作
div 给出将A除以B所得的整数部分。例如17 div 3得出5;

取余操作: %
也叫做取模mod A除以B所得的余数部分

位与操作: &
A和B按位进行与操作的结果, 与表示两个都为1则结果为1
select 4 & 8 from dual; --4转换二进制:0100 8转换二进制:1000
select 6 & 4 from dual; --4转换二进制:0100 6转换二进制:0110

位或操作: |
A和B按位进行或操作的结果 或表示有一个为1则结果为1
select 4 | 8 from dual;
select 6 | 4 from dual;

位异或操作: ^
A和B按位进行异或操作的结果 异或表示两者的值不同,则结果为1
select 4 ^ 8 from dual;
select 6 ^ 4 from dual;

3.4 逻辑运算符
逻辑运算符应该算大家很熟悉的一种了,在很多编程语言中需要通过条件判断从而确定是true或者false,就属于逻辑运算符的范畴;
常用逻辑运算符:
|-----------|----------------------------|
| 运算符含义 | 表达式 |
| 与操作 | A AND B |
| 或操作 | A OR B |
| 非操作 | NOT A 、!A |
| 在操作 | A IN (val1, val2, ...) |
| 不在操作 | A NOT IN (val1, val2, ...) |
| 逻辑是否存在 | [NOT] EXISTS (subquery) |
与操作: A AND B
如果A和B均为TRUE,则为TRUE,否则为FALSE。如果A或B为NULL,则为NULL
sql
select 1 from dual where 3>1 and 2>1;
运行结果

或操作: A OR B
如果A或B或两者均为TRUE,则为TRUE,否则为FALSE
sql
select 1 from dual where 3>1 or 2!=2;
运行结果

非操作: NOT A 、!A
如果A为FALSE,则为TRUE;如果A为NULL,则为NULL。否则为FALSE
sql
select 1 from dual where not 2>1;
select 1 from dual where !2=1;
运行结果

在:A IN (val1, val2, ...)
如果A等于任何值,则为TRUE,这个和mysql中的in的范围查询很类似;
sql
select 1 from dual where 11 in(11,22,33);
运行结果

不在:A NOT IN (val1, val2, ...)
如果A不等于任何值,则为TRUE
sql
select 1 from dual where 11 not in(22,33,44);
运行结果

逻辑是否存在: [NOT] EXISTS (subquery)
将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE 或 FALSE)来决定主查询的数据结果是否得以保留;
sql
select A.* from A
where exists (select B.id from B where A.id = B.id);
3.5 其他运算符
字符串拼接函数
select concat()
复杂类型的构造运算符,也可以理解为hive的内置函数

array使用
