Hive零基础从入门到实战 入门篇(十四) HiveQL:WHERE 语句

目录

 

前言

1. 基本语法

2. 谓词操作符详解

3. AND、OR

4. LIKE、RLIKE、REGEXP


 

前言

SELECT语句用于选取字段,本文我们来介绍用于过滤条件的WHERE语句。两者结合使用可以查找到符合过滤条件的记录。在介绍WHERE语句之前我们已经上文的一个简单例子中使用过它了。之前都是假定大家是见过这样的语句的,现在我们将更多地探讨一些细节。 WHERE语句使用谓词表达式,有几种谓词表达式可以使用AND和OR相连接。当谓词表达式计算结果为true时, 相应的行将被保留并输出。 

 

1. 基本语法

SELECT 列名
FROM 表名
WHERE 列名 运算符 值 [AND 列名 运算符 值] [OR 列名 运算符 值];

注意:WHERE后的列名必须用真实列名,不能使用自定义的别名,否则会报错。

这里仍然使用上篇博客的例子,只选取date_8 = 20190101的前5条记录:

SELECT user_id
      ,use_cnt
FROM app.t_od_use_cnt
WHERE date_8 = 20190101 limit 5;

 

2. 谓词操作符详解

下面表中描述了谓词操作符,这些操作符同样可以用于JOIN…ON和HAVING语句中,后续的博客我们会逐一介绍这两个语句。NULL在Hive中代表空值的意思。

操作符 支持的数据类型 描述
A=B 基本数据类型 如果A等于B则返回TRUE,反之返回FALSE
A<=>B 基本数据类型 如果A和B都为NULL,则返回TRUE,其他的和等号(=)操作符的结果一致,如果任一为NULL则结果为NULL
A<>B, A!=B 基本数据类型 A或者B为NULL则返回NULL;如果A不等于B,则返回TRUE,反之返回FALSE
A 基本数据类型 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,反之为FALSE。如果使用NOT关键字则可达到相反的效果。A、B、C可以是数值、文本或者日期。
A IS NULL 所有数据类型 如果A等于NULL,则返回TRUE,反之返回FALSE
A IS NOT NULL 所有数据类型 如果A不等于NULL,则返回TRUE,反之返回FALSE
IN(数值1, 数值2) 所有数据类型 使用 IN运算显示列表中的值
A [NOT] LIKE B STRING 类型 B是一个SQL下的通配符匹配规则,如果A与其匹配的话,则返回TRUE;反之返回FALSE。B的表达式说明如下:‘x%’表示A必须以字母‘x’开头,‘%x’表示A必须以字母’x’结尾,而‘%x%’表示A包含有字母’x’,可以位于开头,结尾或者字符串中间。如果使用NOT关键字则可达到相反的效果。%代表多个字符,换成_则代表一个字符。
A RLIKE B, A REGEXP B STRING 类型 B是一个正则表达式,如果A与其匹配,则返回TRUE;反之返回FALSE。匹配使用的是JDK中的正则表达式接口实现的,因为正则也依据其中的规则。例如,正则表达式必须和整个字符串A相匹配,而不是只需与其字符串匹配。

 

3. AND、OR

用AND连接两个及以上的谓词操作符代表且的意思,即必须所有条件同时满足;用OR连接两个及以上的谓词操作符代表或的意思,即至少有一个条件满足即可。

下面举几个例子:

1.取出表t_od_use_cnt中满足以下条件的5条记录:

  • 日期为20190101到20190102之间;
  • 平台取ios平台(1为andriod,2为ios);
  • 当日使用次数大于等于30。

语句如下:

SELECT *
FROM app.t_od_use_cnt
WHERE date_8 BETWEEN 20190101 AND 20190102
      AND platform = '2'
      AND use_cnt >= 30 limit 5;

注意:数值型的值可以直接写,但字符格式及string格式的值必须加‘ ’括起来~

运行结果如下:

hive (app)> SELECT *
          > FROM app.t_od_use_cnt
          > WHERE date_8 BETWEEN 20190101 AND 20190102
          >       AND platform = '2'
          >       AND use_cnt >= 30 limit 5;
OK
t_od_use_cnt.platform	t_od_use_cnt.app_version	t_od_use_cnt.user_id	t_od_use_cnt.use_cnt	t_od_use_cnt.is_active	t_od_use_cnt.date_8
2	1.3	10001	49	1	20190101
2	1.1	10016	37	1	20190101
2	1.4	10025	44	1	20190101
2	1.1	10034	49	1	20190101
2	1.2	10039	37	1	20190101
Time taken: 0.28 seconds, Fetched: 5 row(s)

可以看到查出的5条记录同时满足我们设定的三个条件。

 

2.取出表t_od_use_cnt中满足以下条件的5条记录:

  • 日期大于20190102;
  • 1,3和1.4版本且当日使用次数大于等于30 或 1,1和1.2版本且当日使用次数大于等于20。

语句如下:

SELECT *
FROM app.t_od_use_cnt
WHERE date_8 > 20190102
      AND (
            (
                  app_version IN ('1.3', '1.4')
                  AND use_cnt >= 30
                  )
            OR (
                  app_version IN ('1.1', '1.2')
                  AND use_cnt >= 20
                  )
            ) limit 5;

注意:当and、or同时出现时,要使用()将条件区分开,Hive会优先执行括号内的条件语句。这样一来避免逻辑错误,二来使逻辑更清晰。

运行结果如下:

hive (app)> SELECT *
          > FROM app.t_od_use_cnt
          > WHERE date_8 > 20190102
          >       AND (
          >             (
          >                   app_version IN ('1.3', '1.4')
          >                   AND use_cnt >= 30
          >                   )
          >             OR (
          >                   app_version IN ('1.1', '1.2')
          >                   AND use_cnt >= 20
          >                   )
          >             ) limit 5;
OK
t_od_use_cnt.platform	t_od_use_cnt.app_version	t_od_use_cnt.user_id	t_od_use_cnt.use_cnt	t_od_use_cnt.is_active	t_od_use_cnt.date_8
2	1.2	10400	40	1	20190103
1	1.2	10402	32	1	20190103
1	1.2	10403	41	1	20190103
2	1.4	10405	50	1	20190103
2	1.1	10406	24	1	20190103
Time taken: 0.298 seconds, Fetched: 5 row(s)

 

4. LIKE、RLIKE、REGEXP

这三种语句的含义和用法上面已经有所介绍,rlike、regexp功能和like功能一致,只是like是后面只支持简单表达式匹配(_%),而rlike、regexp则支持标准正则表达式语法。所以如果正则表达式使用熟练的话,建议使用rlike,功能更加强大。所有的like匹配都可以被替换成rlike。反之,则不行。注意事项:like是从头逐一字符匹配的,但是rlike则不是。这里我们举几个例子。

1.取出表t_od_use_cnt中满足以下条件的5条记录:

  • 日期大于20190102;
  • user_id以5结尾。

语句如下:

SELECT *
FROM app.t_od_use_cnt
WHERE date_8 > 20190102
      AND user_id LIKE '%5' limit 5;

 运行结果如下:

hive (app)> SELECT *
          > FROM app.t_od_use_cnt
          > WHERE date_8 > 20190102
          >       AND user_id LIKE '%5' limit 5;
OK
t_od_use_cnt.platform	t_od_use_cnt.app_version	t_od_use_cnt.user_id	t_od_use_cnt.use_cnt	t_od_use_cnt.is_active	t_od_use_cnt.date_8
2	1.4	10405	50	1	20190103
1	1.1	10415	30	1	20190103
2	1.3	10425	15	1	20190103
1	1.3	10435	3	0	20190103
1	1.4	10445	43	1	20190103
Time taken: 0.977 seconds, Fetched: 5 row(s)

 

2.取出表t_od_use_cnt中满足以下条件的5条记录:

  • 日期大于等于20190102;
  • user_id中含有45。

语句如下:

SELECT *
FROM app.t_od_use_cnt
WHERE date_8 > 20190102
      AND user_id RLIKE '45' limit 5;

 还可以把RLIKE替换为REGEXP

SELECT *
FROM app.t_od_use_cnt
WHERE date_8 > 20190102
      AND user_id REGEXP '45' limit 5;

 运行结果如下:

hive (app)> SELECT *
          > FROM app.t_od_use_cnt
          > WHERE date_8 > 20190102
          >       AND user_id RLIKE '45' limit 5;
OK
t_od_use_cnt.platform	t_od_use_cnt.app_version	t_od_use_cnt.user_id	t_od_use_cnt.use_cnt	t_od_use_cnt.is_active	t_od_use_cnt.date_8
1	1.4	10445	43	1	20190103
2	1.5	10450	6	1	20190103
2	1.5	10451	38	1	20190103
1	1.4	10452	44	1	20190103
1	1.5	10453	37	1	20190103
Time taken: 0.13 seconds, Fetched: 5 row(s)



hive (app)> SELECT *
          > FROM app.t_od_use_cnt
          > WHERE date_8 > 20190102
          >       AND user_id REGEXP '45' limit 5;
OK
t_od_use_cnt.platform	t_od_use_cnt.app_version	t_od_use_cnt.user_id	t_od_use_cnt.use_cnt	t_od_use_cnt.is_active	t_od_use_cnt.date_8
1	1.4	10445	43	1	20190103
2	1.5	10450	6	1	20190103
2	1.5	10451	38	1	20190103
1	1.4	10452	44	1	20190103
1	1.5	10453	37	1	20190103
Time taken: 0.352 seconds, Fetched: 5 row(s)

RLIKE、REGEXP主要用于正则匹配,具体的正则表达式匹配规则可以参见进阶篇(五)中的介绍。

 

能看到这里的同学,就右上角点个赞顺便关注我吧,3Q~

你可能感兴趣的:(Hive零基础从入门到实战 入门篇(十四) HiveQL:WHERE 语句)