HiveQL查询操作全解(七):union详解

1. union语法

select_statement UNION [ALL | DISTINCT] select_statement UNION [ALL | DISTINCT] select_statement ...

UNION将多个SELECT语句的结果集合并为一个独立的结果集。当前只能支持UNION ALL(bag union)。不消除重复行。每个select语句返回的列的数量和名字必须一样,否则,一个语法错误会被抛出。
从语法中可以看出UNION有两个可选的关键字:
使用DISTINCT关键字与使用UNION 默认值效果一样,都会删除重复行使用ALL关键字,不会删除重复行,结果集包括所有SELECT语句的匹配行(包括重复行)

注意
Hive 1.2.0之前的版本仅支持UNION ALL,其中重复的行不会被删除。Hive 1.2.0和更高版本中,UNION的默认行为是从结果中删除重复的行。

DISTINCT union可以显式使用UNION DISTINCT,也可以通过使用UNION而不使用以下DISTINCT或ALL关键字来隐式生成。
每个select_statement返回的列的数量和名称必须相同。 否则,将抛出错误。

注意
在Hive 0.12.0和更低版本中,UNION只能在子查询中使用,例如“SELECT * FROM(select_statement UNION ALL select_statement)unionResult”。从Hive 0.13.0开始,UNION也可以在顶级查询中使用:例如“select_statement UNION ALL select_statement UNION ALL ...”。 (见HIVE-6189。)在Hive 1.2.0之前,仅支持UNION ALL。 Hive 1.2.0以后版本可以支持支持UNION(或UNION DISTINCT)。

2. UNION在FROM子句内

如果还需要对UNION的结果集进行一些其他的处理,整个语句表达式可以嵌入到FROM子句中,如下所示:

SELECT * FROM 
( select_statement UNION ALL select_statement) 

例如,假设我们有两个不同的表分别表示哪个用户发布了一个视频,以及哪个用户发布了一个评论,那么下面的查询将UNION ALL的结果与用户表join在一起,为所有视频发布和评论发布创建一个注释流:

SELECT u.id, actions.date
FROM ( SELECT av.uid AS uid FROM action_video av WHERE av.date = '2008-06-03' 
UNION ALL 
SELECT ac.uid AS uid FROM action_comment ac WHERE ac.date = '2008-06-03' )
 actions JOIN users u ON (u.id = actions.uid)

你可能感兴趣的