关于HIVE中UNION ALL后在使用group by去重和直接只用UNION去重的效率问题

需要注意的是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

你可能感兴趣的:(HIVE)