大数据03--Hive05 文件存储格式,本地模式,空 key 转换和严格模式

本文介绍了Hive支持的数据存储格式,包括TEXTFILE、SEQUENCEFILE、ORC和PARQUET,其中ORC格式因其高效性和压缩能力而受到推荐。文章还探讨了Hive的执行计划、本地模式在处理小数据量时的优势,以及如何处理空key和COUNT(DISTINCT)操作的优化策略。此外,还提到了并行执行和严格模式设置,以提高查询效率和数据处理的准确性。
摘要由CSDN通过智能技术生成
文件存储格式
Hive 支持的存储数据的格式主要有:TEXTFILE 行式存储、SEQUENCEFILE行式存储、ORC列式存储、PARQUET列式存储
TextFile 格式
默认格式,数据不做压缩,磁盘开销大,数据解析开销大。
Orc 格式 (Optimized Row Columnar)

 每个 Orc 文件由 1 个或多个 stripe 组成,每个 stripe 一般为 HDFS 的块大小,

每个 Stripe 里有三部分组成,分别是 Index DataRow DataStripe 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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值