1.fetch抓取
select * from A;这种语句可以直接读取文件,不走MR程序会快很多;
不走MR程序的情况:
在hive-default.xml.template文件中hive.fetch.task.conversion默认是more,老版本hive默认是minimal,该属性修改为more以后,在全局查找、字段查找、limit查找等都不走mapreduce。
设置conversion参数后再执行sql:
hive (default)> set hive.fetch.task.conversion=none;
2.本地模式
适用于hive的输入量很少的情况,把数据集中到一台最近的机器上处理。小数据集优化效果明显;
开启本地模式:hive (default)> set hive.exec.mode.local.auto=true;
执行SQL
关闭本地模式:hive (default)> set hive.exec.mode.local.auto=false;
自适应开启本地模式:
set hive.exec.mode.local.auto=true; //开启本地mr
//设置local mr的最大输入数据量,当输入数据量小于这个值时采用local mr的方式,默认为134217728,即128M
set hive.exec.mode.local.auto.inputbytes.max=51234560;
//设置local mr的最大输入文件个数,当输入文件个数小于这个值时采用local mr的方式,默认为4
set hive.exec.mode.local.auto.input.files.max=10;
3.join
小表驱动大表原则;新版本hsql已经被优化;
原因:小表被加载进入内存,大表通过关联条件,跟小表对比;
新版本hive的优化,会通过类似于oracle的表分析数据,自己确定大表还是小表。
4.mapjoin
场景:某张表的某个分区的数据远远高于其他分区,发生数据倾斜;
在map端进行join操作:
首先是Task A,它是一个Local Task(在客户端本地执行的Task),负责扫描小表b的数据,将其转换成一个HashTable的数据结构,并写入本地的文件中,之后将该文件加载到DistributeCache中。
接下来是Task B,该任务是一个没有Reduce的MR,启动MapTasks扫描大表a,在Map阶段,根据a的每一条记录去和DistributeCache中b表对应的HashTable关联,并直接输出结果。
案例实操:
(1)开启Mapjoin功能
set hive.auto.convert.join = true; 默认为true
<