[TOC]
Hive是一种将查询语句转化成mapreduce计算的,基于hadoop之上的,存储在HDFS上的数据仓库。
Hive不支持热更新,Storm支持。
使用方法:
建表,load数据,查询,存储数据集
建表语句:
hive> create external table yunpanclicklog(
qid string,
mod string,
act string,
n bigint,
n1 bigint,
s string,
s1 string)
partitioned by (day string)
row format delimited fields terminated by '\t'
stored as inputformat 'com.qihoo.hive.inputformat.YunpanClickLogInputFormat'
outputformat 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' location '/home/yunpan/data/clicklog/';
说明:
external: 该关键字表示建立外表。外表不管理实际的hdfs数据。 partitioned by: 按day做partition,partition的好处是查询时只按需查询。减少hdfs读取,提高查询速度。 row format delimited fields terminated by ‘\t’:表示数据以’\t’分割,如果是自定义inputformat,则value.set()的时候字段之间以’\t’分割。 inputformat ‘com.qihoo.hive.inputformat.YunpanClickLogInputFormat’: 指定自定义的InputFormat类。 location ‘/home/yunpan/data/clicklog/’:指向数据所在的hdfs目录。
内建表 (也称托管表)& 外部表的区别:
区别体现在加载数据和删除数据时:
–加载数据 加载数据到内建表时,hive将数据移动到仓库目下:/home/yunpan/hive/warehouse/加载数据到外部表时,hive不做数据移动,只建立一个类似软链的映射关系。
–删除数据 从内建表删除数据时,hive删除对应目录下的数据。 从外部表删除数据时,hive不删除数据,只解除对应的映射关系。
Load数据:
一般我们是使用external的方式,用下面的方法load数据
hive> alter table yunpanclicklog add partition (day='20121011') location '/home/yunpan/data/clicklog/20121011/';
这是针对存在partition的表,location得是HDFS的路径。 而对于不存在partition的表,直接把数据放到建表时指定的路径下。
对于内部表的load如下
Load 本地数据
load data local inpath /tmp/querylog/log.20120925 into table querylog partition(day=‘2012-09-25’);
Load HDFS的数据
load data inpath ‘hdfs://w-namenode.dfs.shgt.qihoo.net:9000/tmp/querylog/log.20120925’ into table querylog partition(day=‘2012-09-25’);
存储执行结果:
- 将查询结果插入其他表中:
create table mid_url(mid string,url string);
insert overwrite table mid_url select mid,url from querylog;
- 将查询结果放到hdfs某个路径下
insert overwrite directory ‘/home/xitong/result/mid_url/’ select mid,url from querylog;
- 将查询结果放到本地某个路径下
insert overwrite local directory ‘/tmp/result/mid_url/’ select mid,url from querylog;
常用查询语句:
- 删除表
drop table querylog;
- 修改表
alter table querylog add partition (day=‘2012-09-25’) location ‘/home/xitong/querylog/2012-09-25’;
alter table querylog drop parition (day=‘2012-09-25’);
alter table querylog rename to querylog_new;
alter table querylog add columns (level string, city string);
alter table querylog change name name1 string;
- 查看表
show databases;
show tables;
describe querylog;
show partitions safelog;
mapreduce问题
- 遇到需要提取日志的情况,输出太大每次都报一个空指针的问题。这时需要在sh脚本里去掉和reduce相关的参数。