前导
1.数据类型
a)基本数据类型
int(4字节,32位),float(4字节,32位),double(8字节,64位),boolean(true/false),
补充:tinyint(1字节,8位),smallint(2字节,16位),bigint(8字节,64位),string 字符串,binary(二进制)),
timestamp(时间戳),decimal,varchar,date
b)复杂数据类型
array(有序字段,字段类型必须相同,与java中的数组相像),map(一组无序的键/值对,键的类型必须是原子的,值可以是任何类型,同一个映射键的类型必须相同,值的类型也必须相同),
struct(一组命名的字段,字段类型可以不同)
正文
1.存储格式
hive建表时,通过stored as file_format
a)TEXTFILE
默认格式,数据不做压缩,磁盘开销大,数据解析开销大。
可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),
但使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。
create table test(str string)
stored as TEXTFILE;
b)SEQUENCEFILE
SequenceFile是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。
SequenceFile支持三种压缩选择:NONE, RECORD, BLOCK。 Record压缩率低,一般建议使用BLOCK压缩。
create table test2(str string)
stored as SEQUENCEFILE;
c)RCFILE
RCFILE是一种行列存储相结合的存储方式。
首先,其将数据按行分块,保证同一个record在一个块上,
避免读一个记录需要读取多个block。其次,块数据列式存储,
有利于数据压缩和快速的列存取。
CREATE TABLE test3(str string)
stored RCFILE;
d)自定义格式
当用户的数据文件格式不能被当前 Hive 所识别的时候,可以自定义文件格式。
用户可以通过实现inputformat和outputformat来自定义输入输出格式,
> create table test4(str STRING)
> stored as
> inputformat 'org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextInputFormat'
> outputformat 'org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextOutputFormat'
2.编解码器
使用Hive的set io.compression.codecs;再者查看Hadoop集群的配置文件
3.HiveQL数据定义
a)数据库
1)创建数据库
create database LG_TEST;
CREATE DATEBASE IF NOT EXISTS LG_TEST;
2)查看数据库:show database
3)删除数据库:drop database LG_TEST
4)进入数据库:use LG_TEST
b)hive的表
1)管理表
create table table_name(column_name column_property[,column_name1 column_property1])
row format delimited
fields terminated by '\t'
stored as textfile;
2)查看表
show tables;
3)外部表
create external table external_table_name(column_name column_property[,column_name1 column_property1])
row format delimited
fields terminated by '\t'
stored as textfile
location '/user/test';
4)管理分区表
create table table_name(
column_name column_property)
partitioned by(
column_name1 column_property1
[,column_name2 column_property2]);
查看分区数据:
select * from table_name where column_name1='值1' and column_name2='值2'
查看的是按照column_name1,column_name2满足上面条件的表记录
5)外部分区表
create external_table_name(
column_name column_property
[,column_name1 column_property1
,column_name2 column_property2])
partitioned by(
column_name3 column_property3
[,column_name4 column_property4])
row format delimited
fields terminated by '\t';
给外部分区表中添加数据:
alter table table_name add
partition(column_name3='值1',column_name4='值2') location '';
6)删除表
drop table if exists table_name
如果不使用if exists关键字,且表不存在的话,将回抛出一个错误信息
7)表重命名
alter table table_name rename to table_name_new
8)增加、修改、删除表分区
增加分区:
alter table table_name add partition(column_name='新值1',
column_name2='新值2');
修改分区:
alter table table_name
partition(column_name1='值1',column_name2='值2') rename to
partition(column_name1='新值1',column_name2='新值2');
删除分区:
alter table table_name
drop partition(column_name='值1',column_name2='值2');
修改列信息:
alter table table_name change column column_name column_name_new string after column_name2;
增加列:
alter table table_name add columns (column_name_new string);
删除或替换列:
alter table table_name replace columns (column_name STRING);
修改表属性:
alter table table_name set tblproperties('column_name'='yonghu');
查看表属性:
show tblproperties table_name
修改存储属性:
alter table table_name partition(month_id='201508',prov_id='011',day_id='02') set fileformat rcfile;