[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问题

  1. 遇到需要提取日志的情况,输出太大每次都报一个空指针的问题。这时需要在sh脚本里去掉和reduce相关的参数。