1.概述
Hive官方提供了一种联合查询的语法,原名为Union Syntax,用于联合两个表的记录进行查询,此处的联合和join是不同的,join是将两个表的字段拼接到一起,而union是将两个表的记录拼接在一起。 换言之, join是用于左右拼接,而union是用于上下拼接。
2.语法
sql
select_statement UNION [ALL | DISTINCT] select_statement UNION [ALL | DISTINCT] select_statement ...
UNION是将多个查询结果集合并到一个结果中。UNION与UNION ALL的区别是 union会对两个子查询的结果去重合并,而union all不会对子查询结果去重处理。
注:
- Hive 1.2.0之前的版本仅支持UNION ALL,其中重复的行不会被删除。
- Hive 1.2.0和更高版本中, union的默认从结果中删除重复行。使用可选的distinct关键字指定了删除重复行。使用可选的all关键字,不会删除重复行,结果包含select语句中的所有匹配行。
- 可以在同一查询中混合使用union all和union distinct。
- 每个select语句返回的列的数量和名称必须相同,否则报错。
3.使用案例
3.1 准备数据
test1表数据
id | username | ds |
---|---|---|
001 | zhangsan | 20240307 |
002 | lisi | 20240307 |
003 | wangwu | 20240307 |
test2表数据
id | username | ds |
---|---|---|
002 | lisi | 20240307 |
003 | wangwu | 20240307 |
004 | zhaoliu | 20240307 |
3.2 查询结果
UNION的查询结果
sql
SELECT id
,username
FROM test1
WHERE ds = '${bizdate}'
UNION
SELECT id
,username
FROM test2
WHERE ds = '${bizdate}';
id | username |
---|---|
001 | zhangsan |
002 | lisi |
003 | wangwu |
004 | zhaoliu |
UNION ALL 的查询结果
id | username |
---|---|
002 | lisi |
003 | wangwu |
001 | zhangsan |
002 | lisi |
004 | zhaoliu |
003 | wangwu |
4.总结
联合查询方式 | UNION | UNION ALL |
---|---|---|
对重复结果的处理 | 筛选掉重复的结果 | 不会去除重复记录 |
对排序的处理 | 将两个结果合并后并返回 | 会按照字段的顺序进行排序 |
效率 | 快 | 慢 |
总述 | 不去重不排序 | 去重并排序 |
- UNION ALL:不去重不排序直接原表合并。
- UNION:先表合并、再去重、再排序。<=>作用等价于 先distinct去重、再UNION ALL表合并、再order by排序。
- 效率方面,UNION是UNION ALL的3倍。数据量大时,不建议直接用UNION,建议先去重再UNION ALL。