分区表和分桶表以及各种复杂数据类型自我总结

分区表:就是分目录,查询通过分区字段进行筛选来避免全表扫描,提升查询效率.

分桶表:就是分文件,通过随机抽样等操作来提升查询效率.将一个文件通过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()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值