1.Hive数据类型
Hive支持原始数据类型和复杂类型,原始类型包括数值型,Boolean,字符串,时间戳。复杂类型包括数组,map,struct。下面是Hive数据类型的一个总结:
分类 | 类型 | 描述 | 示例 |
---|---|---|---|
原始类型 | BOOLEAN | true/false | TRUE |
TINYINT | 1字节的有符号整数 -128~127 | 1Y | |
SMALLINT | 2个字节的有符号整数,-32768~32767 | 1S | |
INT | 4个字节的带符号整数 | 1 | |
BIGINT | 8字节带符号整数 | 1L | |
FLOAT | 4字节单精度浮点数1.0 | 1.0F | |
DOUBLE | 8字节双精度浮点数 | 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) |
MAP | true/false | TRUE | |
STRUCT | key-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;