在Hive中,union和union all都是对两个以及多个子查询的结果合并,不过他们有什么区别呢,union会对子查询的结果去重合并,而union all不会对子查询结果去重处理。下面让我们一起看看吧。
一、union
1. union 语法
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
2. 数据准备
informations信息表中的数据如下:
hive> SELECT * FROM informations;
+-----+--------------+-------------------+-----------+
| id | name | phone | country |
+-----+--------------+-------------------+------- ---+
| 1 | zhangsan | 17426323494 | CN |
| 2 | lisi | 13026468221 | CN |
| 3 | wangwu | 13323447234 | USA |
| 4 | zhaoliu | 18626525707 | CN |
| 5 | xiaoming | 15020472984 | USA |
| 7 | wanghao | 13012396032 | IND |
+-----+--------------+-------------------+-----------+
apps表中的数据如下:
hive> SELECT * FROM apps;
+------+------------+-------------------------+---------+
| id | app_name | url | country |
+------+------------+-------------------------+---------+
| 1 | QQ APP | http://im.qq.com/ | CN |
| 2 | 微博 APP | http://weibo.com/ | CN |
| 3 | 淘宝 APP | https://www.taobao.com/ | CN |
+------+------------+-------------------------+---------+
3. 测试结果
执行以下SQL输出结果如下:
hive> SELECT country FROM informations
UNION
SELECT country FROM apps
ORDER BY country;
+---------+
| country |
+---------+
| CN |
| CN |
| CN |
+---------+
小结:union会对子查询的结果去重合并。
二、union all
1. union all 语法
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;
注意:union结果集中的列名总是等于union中第一个select语句中的列名。
2. 数据准备
informations信息表中的数据如下:
hive> SELECT * FROM informations;
+-----+--------------+-------------------+-----------+
| id | name | phone | country |
+-----+--------------+-------------------+------- ---+
| 1 | zhangsan | 17426323494 | CN |
| 2 | lisi | 13026468221 | CN |
| 3 | wangwu | 13323447234 | USA |
| 4 | zhaoliu | 18626525707 | CN |
| 5 | xiaoming | 15020472984 | USA |
| 7 | wanghao | 13012396032 | IND |
+-----+--------------+-------------------+-----------+
apps表中的数据如下:
hive> SELECT * FROM apps;
+------+------------+-------------------------+---------+
| id | app_name | url | country |
+------+------------+-------------------------+---------+
| 1 | QQ APP | http://im.qq.com/ | CN |
| 2 | 微博 APP | http://weibo.com/ | CN |
| 3 | 淘宝 APP | https://www.taobao.com/ | CN |
+------+------------+-------------------------+---------+
3. 测试结果
执行以下SQL输出结果如下:
hive> SELECT country FROM informations
UNION ALL
SELECT country FROM apps
ORDER BY country;
+---------+
| country |
+---------+
| CN |
| CN |
| CN |
| CN |
| CN |
| CN |
| USA |
| USA |
| IND |
+---------+
小结:union all不会对子查询结果去重处理。
三、总结
union和union all操作符用于合并两个或多个select语句的结果集。但union去重合并,而union all不去重处理。注意:union内部的每个select语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时每个select语句中的列的顺序必须相同。