hive的union,hive连接查询的优化,mapjoin的设置参数
1.union
union的使用场景
当hive使用连接查询时它有一个必要的限制,必须要两个结果集有关系才能进行连接,
当两个结果集没有任何关系时可以用union关键字进行两个结果集的集合展示
union的特性
union在查出结果集会对结果集进行排序,这是mapreduce的特性
union使用时候可以去重,如果不希望去重可以使用union all,但是union all不排序
union使用的前提是每个结果集使用的表头必须是相同的字段
2.hiveSQL的优化措施
hive中使用mapjoin提高sql语句的执行效率的原理是:它会把小表全部读入内存中,在map的时候
直接拿另外一张表的数据和内存中的数据做匹配,进行join操作,这样省去了reduce
(1)设置参数来优化
在同一个sql中的不同job是否可以同时运行,加快SQL执行的速度
set hive.exec.parallel=true;
增加同一个sql允许并行任务的最大线程数
set hive.exec.parallel.thread.number=8;
(2)用mapjoin的设置参数
是否忽略mapjoin标记
hive.ignore.mapjoin.hint=true
开启自动mapjoin
hive.auto.convert.join = true
(3)mapjoin的配置参数
set hive.auto.convert.join=true; 将小表刷入内存中,默认true
set hive.ignore.mapjoin.hint=true; 是否忽略mapjoin hint 即mapjoin标记,默认true
set hive.mapjoin.smalltable.filesize=2500000; 表示2500000以下的都叫小表
(4)mapjoin的注意实现
left outer join的左边必须是大表
right outer join的右表必须是大表
inner join左表或右表均可以是大表
full outer join不能使用mapjoin
mapjoin支持小表为子查询
mapjoin可以使用不等值连接或者使用or连接多个条件
mapjoin的实现方法
1.在map-reduce的驱动程序中使用静态方法,DistributedCache.addCache File要增加拷贝的小表文件。JobTraker在作业启动之前会获取这个URI列表,
并将相应的文件拷贝到各个TaskTracker的本地磁盘上
2.在 map类的setup方法中使用DistributedCache.getLocalCacheFiles()方法获取文件目录,并使用标准的文件读写相应的文件
表文件的大小作为开启和关闭mapjoin的阈值
hive>set hive.mapjoin.smaltable.filesize=25000000 即25M