买这本书没有认真看完过,重新看下,记录下自己不会或者之前不用且模棱两可的知识点。
第三章:数据类型
3.1 hive的基本数据类型,是对java数据类型的实现,在hive中,如果是float和double数据类型比较,hive会隐式把float转换成double,即向上取
3.2 集合数据类型,struct、map、array三种集合数据类型
struct:与c语音的struct或者"对象,{"col1":"a","col2":123}: 主要函数:1、struct 2、select named_struct('user_id',10001,'user_name','LiLei') 3、inline(将给定的STRUCT数组展开。每个数组元素对应一行,每行每个STRUCT元素对应一列);
map: map是一组键值对,{k11:86, k21:15},可以使用may_keys,map_values取出key或者value,返回值为array
array:是一组有相同类型和名称的变量的集合,变量称为数组的元素。常用方法有array_contains、array_intersect(计算两个ARRAY的交集),和java的array对应
第四章:数据定义
4.3 创建表
建表时可以指定if not exists,如果有相同表名的表了,hive就会忽略后面的执行语句
describe formatted table_name;
第五章:数据操作
5.2 分区操作
set hive.exec.max.dynamic.partitions.pernode=100; 每个mapper或者reducer可以创建的最大的动态分区个数
set hive.exec.max.dynamic.partitions=1000; 一个动态分区语句可以创建的最大动态分区个数
第六章:查询
6.1 select语句
set hive.map.aggr=true; 会触发在map阶段的"顶级"聚合过程
6.4.2 join优化
join顺序是从上到下的
当对3个或者更多的表进行join时,如果每个on语句都用相同的连接键的话,那么只会产生一个mapreduce任务
6.4.7 left semi join
满足等值条件下左表的记录(a left b where b.col is null差不多),但是这个更高效,join时找到了等值条件就停止扫描
6.5 sort by
对某些字段单独排序,全局不唯一
6.7 cluster by
distribute by cola order by cola = cluster by cola(升序情况下)
第八章:索引
hive只有有限的索引功能,hive中没有普通关系型数据库中键的概念,但是可以对一些字段建立索引来加速某些操作,一张表的索引数据存储在另一张表中。
创建索引也需要消耗计算资源
8.1 bitmap索引(之前见别的人面试中说过这个优化,记录下)
bitmap索引普遍应用于重排后值较少的列
创建语句:create index tmp_index on table dim_trd_goods(goods_id) as 'bitmap' in table dim_trd_goods_index_table;
8.3 显示索引
show formatted index on dim_trd_goods;
第九章:模式设计
9.2 关于分区
分区过多会导致创建大量的非必须的hadoop文件和文件夹,一个分区就对应着一个包含有多个文件的文件夹。长此以往,会超出nameNode对系统云数据信息的处理能力。nameNode会将系统文件的元数据信息保存在内存中。
理想的分区方案是系统不应该导致产生太多的分区和文件夹目录,每个分区下的文件应该是文件系统中块的大小的若干倍。(一般是128M)
第十章:调优
10.1 explain
看hive的执行计划:explain select count(id) from bigdata2c.tmp_xuemin_community;(阿里云环境下)
TS即TableScan
In Job job0:
root Tasks: M1
In Task M1:
Data source: bigdata2c.tmp_xuemi_community
TS: bigdata2c.tmp_xuemi_community
AGGREGATE:
UDAF: COUNT(id) (__agg_0_count)[Complete]
SEL: __agg_0
FS: output: Screen
schema:
__agg_0 (bigint) AS _c0
10.5 本地模式
小数据集下省去了触发查询的执行任务时间
set hive.exec.mode.local.auto=true;
10.6 并行执行
set hive.exec.parallel=true;
一般作用于union all查询
10.7 严格查询模式
1、分区表必须指定分区
2、order by 必须添加limit
3、限制笛卡尔积的查询
10.8 调整mapper和reducer个数
--设置每个reduce锁接受的数据量大小,默认是1G
set hive.exec.reducers.bytes.per.reducer=500000000;
--设置reduce数量
set mapred.reduce.tasks=20;
10.9 JVM重用
适用于小文件场景或task特别多的场景
hadoop的默认配置通常是使用派生JVM来执行map和reduce任务的,这时JVM的启动过程可能会造成相当大的开销,JVM重用可以使得JVM实例在同一个job中重新使用n次。
缺点是:开启JVM重用将会一直占用使用到的task插槽,以便进行重用,直到任务完成后才能释放。如果某个job中有某几个reduce task执行时间要比其他的reduce task执行时间多得多的话(长尾),保留的插槽会无法被其他的job使用,直到所有的task都结束了才会释放。