Hive数据类型与分区分桶

1.Hive数据类型

Hive支持原始数据类型和复杂类型,原始类型包括数值型,Boolean,字符串,时间戳。复杂类型包括数组,map,struct。下面是Hive数据类型的一个总结:

分类类型描述示例
原始类型BOOLEANtrue/false TRUE
TINYINT1字节的有符号整数 -128~127 1Y
SMALLINT2个字节的有符号整数,-32768~32767 1S
INT4个字节的带符号整数1
BIGINT8字节带符号整数 1L
FLOAT4字节单精度浮点数1.01.0F
DOUBLE8字节双精度浮点数 1.0
DEICIMAL任意精度的带符号小数 1.0
STRING字符串,可变长“a”,’b’
VARCHAR变长字符串“a”,’b’
CHAR固定长度字符串“a”,’b’
BINARY字节数组BOOLEAN
TIMESTAMP时间戳,纳秒精度122327493795
DATE日期‘2016-03-29’
复杂类型ARRAY有序的的同类型的集合 array(1,2)
MAPtrue/false TRUE
STRUCTkey-value,key必须为原始类型,value可以任意类型struct(‘1’,1,1.0), named_stract(‘col1’,’1’,’col2’,1,’clo3’,1.0)
UNION在有限取值范围内的一个值 create_union(1,’a’,63)

2.分区表

创建

单分区建表语句

create table day_table (id int, content string) partitioned by (dt string);

多分区建表语句:

create table day_hour_table (id int, content string) partitioned by (dt string, hour string);

修改

ALTER TABLE day_table ADD
PARTITION (dt='2008-08-08', hour='08')
location '/path/pv1.txt'

删除

ALTER TABLE table_name DROP
partition_spec, partition_spec,..

用户可以用 ALTER TABLE DROP PARTITION 来删除分区。分区的元数据和数据将被一并删除。例:

ALTER TABLE day_hour_table DROP PARTITION (dt='2008-08-08', hour='09');

数据加载进分区表中语法:

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

例:

LOAD DATA INPATH '/user/pv.txt' INTO TABLE day_hour_table PARTITION(dt='2008-08- 08', hour='08'); LOAD DATA local INPATH '/user/hua/*' INTO TABLE day_hour partition(dt='2010-07- 07');

当数据被加载至表中时,不会对数据进行任何转换。Load操作只是将数据复制至Hive表对应的位置。数据加载时在表下自动创建一个目录

查看分区语句

 show partitions day_hour_table;

3.桶表

(1)桶表是对某一列数据进行哈希取值以将数据打散,然后放到不同文件中存储。

(2)在hive分区表中,分区中的数据量过于庞大时,建议使用桶。

(3)在分桶时,对指定字段的值进行hash运算得到hash值,并使用hash值除以桶的个数做取余运算得到的值进行分桶,保证每个桶中有数据但每个桶中的数据不一定相等。

​ 做hash运算时,hash函数的选择取决于分桶字段的数据类型

(4)分桶后的查询效率比分区后的查询效率更高

创建

 create table btable1 (id int) clustered by(id) into 4 buckets;

创建只有一个字段(id)的桶表,按照id分桶,分为4个bucket,而bucket的数量等于实际数据插入中reduce的数量。

桶表不能通过load的方式直接加载数据,只能从另一张表中插入数据

先在hive里面开启桶表

set hive.enforce.bucketing = true;

创建中间过渡表并为其加载数据

create table btest2(id int);
load data local inpath 'btest2' into table btest2;

桶表的数据插入

insert into table btest1 select * from btest2;

修改桶表中bueket数量

alter table btest3 clustered by(name,age) sorted by(age) into 10 buckets;

Hive中的抽样查询

  select * from table_name tablesample(bucket X out of Y on field);

select * from table_name tablesample(bucket X out of Y on field);

X表示从哪个桶中开始抽取,Y表示相隔多少个桶再次抽取。

Y必须为分桶数量的倍数或者因子,比如分桶数为6,Y为6,则表示只从桶中抽取1个bucket的数据;若Y为3,则表示从桶中抽取6/3(2)个bucket的数据

4.数据访问

 select * from table_name;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值