Hive 是facebook开源的一个基于hadoop框架的查询工具,也就是说,需要用hive的话,就要先安装hadoop。这次是小结一下最近用hive的心得,经验分享。hadoop和hive,pig,hbase的安装配置以后专门另开个连载说比较好。



 



所以,我假设你已经有hive了。



 



1.字段的数据类型。



hive实际上为了数据挖掘的需要,对hive表的字段设置了数据类型,对于经常where的,还可以设置index。



 



数据类型分以下几种



 



STRING 不定长字符串
TINYINT 3位长整型数
SMALLINT 5位长整型
INT 10位整型
BIGINT 19位整型
FLOAT 浮点数
DOUBLE 双精度
BOOLEAN 布尔型,也就是TRUE和FALSE

不同的整型数有不同的位数限制,这个创建表的时候需要注意一下,别因为位数不够造成数据截取。位数过大,又会造成元数据的空间浪费。

还有三种不常用到的
STRUCTS 结构体
ARRAY 数组
MAP 这个不知道该怎么翻译合适



 



2.创建数据表。



 



hive的数据表分为两种,内部表和外部表。



 



内部表指hive创建并通过load data inpath进数据库的表,这种表可以理解为数据和表结构都保存在一起的数据表。当你通过DROP TABLE table_name 删除元数据中表结构的同时,表中的数据也同样会从hdfs中被删除。



 



外 部表指在表结构创建以前,数据已经保存在hdfs中了,通过创建表结构,将数据格式化到表的结构里。当DROP TABLE table_name 的时候,hive仅仅会删除元数据的表结构,而不会删除hdfs上的文件,所以,相比内部表,外部表可以更放心大胆的使用。



 



内部表建表语句:



CREATE 
    TABLE database.table1 
    
( 
    
column1 STRING COMMENT 
    'comment1', 
    
column2 
    INT COMMENT 
    'comment2'
);



外部表创建语句:



 



下面是hdfs中文件不用LZO压缩,纯文本保存时,如何创建外部表:


CREATE EXTERNAL 
    TABLE 
    IF 
    NOT 
    EXISTS 
    database.table1 
    
( 
    
column1 STRING COMMENT 
    'comment1', 
    
column2 STRING COMMENT 
    'comment2'
) 
    
ROW FORMAT DELIMITED FIELDS TERMINATED 
    BY "\t" 
    
LOCATION 
    'hdfs:///data/dw/asf/20120201';


 



下面是,当hdfs中的文件用LZO压缩后,如何创建外部表,当然你需要hadoop-gpl的支持才能以文本形式读取lzo文件。



CREATE EXTERNAL 
    TABLE 
    IF 
    NOT 
    EXISTS 
    database.table1 
    
( 
    
column1 STRING COMMENT 
    'comment1', 
    
column2 STRING COMMENT 
    'comment2'
) 
    
ROW FORMAT DELIMITED FIELDS TERMINATED 
    BY "\t" 
    
 
    STORED 
    AS INPUTFORMAT "com.hadoop.mapred.DeprecatedLzoTextInputFormat" OUTPUTFORMAT "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat" 
    
LOCATION 
    'hdfs:///data/dw/asf/20120201';



 



3.删除数据表



 



正如我们前面所说,数据表在删除的时候,内部表会连数据一起删除,而外部表只删除表结构,数据还是保留的。这个需要注意一下。



 



4.修改表结构



 



新添加字段



ALTER 
    TABLE table1 
    ADD COLUMNS 
    
( 
    
column1 string COMMENT 
    'comment1', 
    
column2 string COMMENT 
    'comment2' 
    
);



修改表名



ALTER 
    TABLE 
    database.table1 RENAME 
    TO 
    database.table2;



修改数据表,以使用LZO压缩数据。



ALTER 
    TABLE table1 
    
SET FILEFORMAT 
    
INPUTFORMAT "com.hadoop.mapred.DeprecatedLzoTextInputFormat" 
    
OUTPUTFORMAT 
    
"org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat";



 



5.内部表加载数据



 



从本地文件系统中加载数据。



LOAD DATA LOCAL INPATH "/opt/data/1.txt" 
    INTO 
    TABLE



 



从HDFS中加载数据



LOAD DATA INPATH "/data/datawash/1.txt" 
    INTO 
    TABLE



 



关于加载中的OVERWRITE是这样。



LOAD DATA LOCAL INPATH "/opt/data/1.txt" OVERWRITE 
    INTO 
    TABLE



 



HIVE还包含很多功能,View,index,自定义函数等,这个慢慢再说吧。