最近一直用hadoop处理数据,处理完以后要对数据进行分析,由于我们的数据不是很大,每次我都是把要分析的文件从hdfs下载到本地,然后再用python、shell脚本进行分析与统计,那hadoop生态系统中都有什么数据分析工具呢,目前据我所知,有两个:pig和hive。因为pig我以前看过,需要用Pig Lation(pig自己的脚本语言),为了省事,我这次直接看基于sql语句的hive。pig与hive的区别《Hadoop in action》书中是这么定义的:
Pig----A high-level data flow language
Hive------A SQL-like data warehouse infrastructure
废话不多说,直接实战:
第一步:配置hadoop环境
首先需要在本地搭建好hadoop运行环境,这里我用的是伪分布式版,具体可以参照我这篇文章:http://blog.csdn.net/jiacai2050/article/details/7872708
第二步:下载hive
在apache的官网,我下载的是这么一个文件hive-0.11.0.tar.gz
第三步:配置hive
由于hive需要存放metastore,这里我们使用JDBC compliant(即JDBC兼容)数据库,hive自带了一个Derby,我们用自带的即可,这里无需做任何操作。
第四步:配置环境变量
把hive/bin加到path中,编辑.profile文件,可以输入以下命令:
vim ~/.profile我机器的配置这么样的:
export HADOOP_HOME="/home/liujiacai/hadoop" export HIVE_HOME="/home/liujiacai/hive" export PATH=$HADOOP_HOME/bin:$HIVE_HOME/bin:$PATH这么配置好,以后在执行hadoop相关命令时有可能会出现个warning,提示$HADOOP_HOME is deprecated,在hadoop/conf/hadoop-env.sh文件中添加这么一行就行了:
export HADOOP_HOME_WARN_SUPPRESS="TRUE"
$ $HADOOP_HOME/bin/hadoop fs -mkdir /tmp $ $HADOOP_HOME/bin/hadoop fs -mkdir /user/hive/warehouse $ $HADOOP_HOME/bin/hadoop fs -chmod g+w /tmp $ $HADOOP_HOME/bin/hadoop fs -chmod g+w /user/hive/warehouse
这些命令主要是创建hive数据的存放路径,并让用户所属组有写
到现在hive就应该能正常运行了。
-----------------------------------------------------------------------------HIVE常用操作---------------------------------------------------------------------------------------------------------------------------------
1.创建表的完整语句
create [external] table active(ukey string, docic int) comment "this is for analysing user's reading history" partitioned by (month int, day int) clustered by (ukey) into 32 buckets row format delimited fields terminated by '\t' lines terminated by '\n' stored as sequencefile/textfile
[external]表示可选项,表示创建表的数据来源于已有的hdfs文件
partitioned by语句主要是为了处理子文件夹的情况
clustered by语句主要是控制生成的part-0000*的文件个数
stored as语句说明表文件存放的格式,现在只有两种。
2.partitioned by语句用法
我的情况,日志文件按日存放,每一天一个文件夹,像
/data/log/2013/10/10
/data/log/2013/10/11
/data/log/2013/10/12
..................
/data/log/2013/11/10
/data/log/2013/11/11
....................
这样的形式,为了把这些文件中的数据存放到hive的表中,我们需要用partitioned
我们首先创建这么一个表
create external table log(ukey string, docic int) partitioned by (month int, day int) row format delimited fields terminated by '\t';
然后在用这条语句进行log表的修改
alter table log add partition(month=10,day=10) location '/data/log/2013/10/10'
这样就把10月10号这天的日志包含进log表了
3.表的连接join
一个模板:
insert overwrite table query_result select pv.* u.gender, u.age from page_view pv JOIN user u ON (pv.userid = u.id);现在hive中的join只支持“相等”连接。