文件存储格式
Hive 支持的存储数据的格式主要有:TEXTFILE 行式存储、SEQUENCEFILE行式存储、ORC列式存储、PARQUET列式存储。
TextFile
格式
默认格式,数据不做压缩,磁盘开销大,数据解析开销大。
Orc 格式
(Optimized Row Columnar)
![](https://i-blog.csdnimg.cn/blog_migrate/2312f0eae75cce2616cc774491355cf8.png)
每个 Orc 文件由 1 个或多个 stripe 组成,每个 stripe 一般为 HDFS 的块大小,
每个 Stripe 里有三部分组成,分别是 Index Data,Row Data,Stripe Footer
执行计划(Explain)
查看语句的执行计划
explain select * from emp;
explain select deptno, avg(sal) avg_sal from emp group by deptno;
查看详细执行计划
explain extended select * from emp;
explain extended select deptno, avg(sal) avg_sal from emp group by deptno;
本地模式
有时
Hive 的输入数据量是非常小的.
在这种情况下,为查询触发执行任务消耗的时间可能 会比实际 job
的执行时间要多的多。对于大多数这种情况,
Hive
可以通过本地模式在单台机 器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。
set hive.exec.mode.local.auto=true; //开启本地 mr
//设置 local mr 的最大输入数据量,当输入数据量小于这个值时采用 local mr 的方式,默认
为 134217728,即 128M
set hive.exec.mode.local.auto.inputbytes.max=50000000;
//设置 local mr 的最大输入文件个数,当输入文件个数小于这个值时采用 local mr 的方式,默
认为 4
set hive.exec.mode.local.auto.input.files.max=10;
空
key
转换
有时虽然某个
key
为空对应的数据很多,但是相应的数据不是异常数据,必须要包含在
join
的结果中,此时我们可以表
a
中
key
为空的字段赋一个随机的值,使得数据随机均匀地
分不到不同的
reducer
上 注意下面的nvl函数
insert overwrite table jointable
select n.* from nullidtable n full join bigtable o on
nvl(n.id,rand()) = o.id;
Count(Distinct)
去重统计
一般不直接用,先group by形成一个子表,再来进行count
数据量小的时候无所谓,数据量大的情况下,由于
COUNT DISTINCT
操作需要用一个
Reduce Task
来完成,这一个
Reduce
需要处理的数据量太大,就会导致整个
Job
很难完成,
一般
COUNT DISTINCT
使用先
GROUP BY
再
COUNT
的方式替换
,
select count(id) from (select id from bigtable group by id) a;
并行执行
Hive
会将一个查询转化成一个或者多个阶段。这样的阶段可以是
MapReduce
阶段、抽
样阶段、合并阶段、
limit
阶段。或者
Hive
执行过程中可能需要的其他阶段。默认情况下,
Hive
一次只会执行一个阶段。
不过,某个特定的
job
可能包含众多的阶段,而这些阶段可能 并非完全互相依赖的,也就是说有些阶段是可以并行执行的,这样可能使得整个 job
的执行时间缩短。
set hive.exec.parallel=true; //打开任务并行执行
set hive.exec.parallel.thread.number=16; //同一个 sql 允许最大并行度,默认为
8。
当然,得是在系统资源比较空闲的时候才有优势,否则,没资源,并行也起不来。
严格模式
分区表不使用分区过滤
将
hive.strict.checks.no.partition.filter
设置为
true
时,对于分区表,
除非
where
语句中含
有分区字段过滤条件来限制范围,否则不允许执行。
hive (default)> set hive.strict.checks.no.partition.filter=true;