需要注意的是HIVE1.2.0版本之前只有UNION ALL不支持UNION
Hive 1.2.0之前的版本仅支持UNION ALL,其中重复的行不会被删除。
Hive 1.2.0和更高版本中,UNION的默认行为是从结果中删除重复的行。
下面是官方的使用文档:
select_statement UNION [ALL | DISTINCT] select_statement UNION [ALL | DISTINCT] select_statement …
可以看到,如果使用union去重,去重方式是使用distinct,而distinct的去重规则是两两作比较,在数据量非常大的时候这个时间会花费非常大。
从我们掌握的知识预计来说先使用union all之后在使用group by来进行去重效率会相对较高。
实际测试中:
引擎:MR
数据量:615736301+615736301+615736301条数据
语法:UNION ALL后在group by去重
结果:
Map: 184 Reduce: 55 Cumulative CPU: 26154.84 sec HDFS Read: 14030932860 HDFS Write: 14867769647 SUCCESS
INFO : Total MapReduce CPU Time Spent: 0 days 7 hours 15 minutes 54 seconds 840 msec
Time taken: 1669.613 seconds
耗时:1669秒
引擎:MR
数据量:615736301+615736301+615736301条数据
语法:直接UNION去重
结果:
tage-Stage-1: Map: 59 Reduce: 27 Cumulative CPU: 10746.87 sec HDFS Read: 6853568415 HDFS Write: 36377053007 SUCCESS
INFO : Stage-Stage-2: Map: 284 Reduce: 171 Cumulative CPU: 31357.83 sec HDFS Read: 43556220234 HDFS Write: 16704282606 SUCCESS
INFO : Total MapReduce CPU Time Spent: 0 days 11 hours 41 minutes 44 seconds 700 msec
Time taken: 3448.166 seconds
耗时:3448秒
以上结果显示先union all在使用group by去重效率比直接使用union高一倍。
大数据量面前 distinct去重显得太鸡肋了。
我们从细节看:
先使用union all在进行group by去重:
job num:1
Map num:184
Reduce num:55
Time taken: 1669.613 seconds
直接使用union的去重方式:
job num:2
job1_Map num:59
job1_Reduce num:27
job1_Map num:284
job1_Reduce num:171
Time taken: 3448.166 seconds