分区表:就是分目录,查询通过分区字段进行筛选来避免全表扫描,提升查询效率.
分桶表:就是分文件,通过随机抽样等操作来提升查询效率.将一个文件通过hash取模的方式放到各自对应的桶中,分了几个桶就有几个文件.
分区表语法
一级分区:create table 表名(字段名 字段类型...) partitioned by (分区字段 字段类型) row format delimited fields terminated by '分隔符';--本质上是建造一个目录
多级分区:create table 表名(字段名 字段类型...) partitioned by (分区字段1 字段类型1,分区字段2 字段类型2) row format delimited fields terminated by '分隔符';--本质上是创造多级目录
加载数据:load data inpath '文件的路径' into table 表名 partition (一级分区字段名='值',...);--本质上是在hdfs上移动数据,原数据会消失
验证数据:select * from product where ??
注意:分区字段和表中字段不能重复,分区字段一般放在表的后面,
增加分区:alter table 表名 add partiton (分区字段名='值',...);
修改分区名:alter table 表名 partition (分区字段名='旧值') rename to partition (分区字段名='新值') ;
删除分区:alter table 表名 drop partiton (分区字段名='值',....);
查看所有分区:show partitions 分区表名;
同步/修复分区:msck repair table 分区表名;
分桶表语法
create table 表名 (字段名 字段类型...) clusteded by (分桶字段) into 桶数量 buckets row format delimited fields terminated by '分隔符';--本质上是创建了几个文件,分了几个桶就有几个文件,分桶字段是表中字段其中一个
插入数据:load data inpath '文件的路径' into table 表名;--本质上是在hdfs上扫描文件数据,原文件不会消失,通过hash取模方式将数据放到对应文件里面
分桶表排序语法
create table 表名 (字段名 字段类型...) clusteded by (分桶字段) sorted by (排序字段名 asc|desc) into 桶数量 buckets row format delimited fields terminated by '分隔符';
重要参数:--默认开始,hive2.x版本已经被移除
set hive.enforce.bucketing; -- 查看未定义因为已经被移除
set hive.enforce.bucketing=true; -- 修改
--查看reduce数量
参数优先级:set方式>hive文档>hadoop文档
set mapreduce.job.reduces; -- 查看默认-1,代表自动根据桶数量匹配reduce数量
set mapreduce.job.reduces=3; -- 设置参数
hash取模:字段名对应数字%分的桶个数然后取余数进行区分
序列和反序列:序列就是将看得懂的数据转化为看不懂的传输数据,反序列就是相反的方式
复杂数据类型(借鉴)
array类型: 又叫数组类型,存储同类型的单数据的集合
建表指定类型: array<数据类型>
取值: 字段名[索引] 注意: 索引从0开始
获取长度: size(字段名)
判断是否包含某个数据: array_contains(字段名,某数据)
struct类型: 又叫结构类型,可以存储不同类型单数据的集合
建表指定类型: struct<子字段名1:数据类型1, 子字段名2:数据类型2 , ...>
取值: 字段名.子字段名n
map类型: 又叫映射类型,存储键值对数据的映射(根据key找value)
建表指定类型: map<key类型,value类型>
取值: 字段名[key]
获取长度: size(字段名)
获取所有key: map_keys()
获取所有value: map_values()