本文转载自 : http://blog.csdn.net/u013063153/article/details/54313217
本文数据来自于搜狗实验室:用户查询日志下载路径 http://www.sogou.com/labs/resource/q.php
第一步 启动HDFS、YARN和Hive,启动完毕后创建Hive数据库
hive>create database hive;
hive>show databases;
hive>use hive;
第二步 创建内部表
由于Hive使用了类似SQL的语法,所以创建内部表的语句相对SQL只增加了行和字段分隔符。
hive>CREATE TABLE SOGOUQ2(DT STRING,WEBSESSION STRING,WORD STRING,S_SEQ INT,C_SEQ INT,WEBSITE STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' ;
第三步 加载数据
数据文件可以从HDFS或者本地操作系统加载到表中,如果加载HDFS文件使用LOAD DATA INPATH,而加载本地操作系统文件使用LOAD DATA LOCAL INPATH命令。HIVE表保存的默认路径在${HIVE_HOME}/conf/hive-site.xml配置文件的hive.metastore.warehouse.dir属性指定,当创建表时会在hive.metastore.warehouse.dir指向的目录下以表名创建一个文件夹,在本演示中表默认指向的是/user/hive/warehouse。
数据文件在本地操作系统将复制到表对应的目录中,而数据文件在HDFS中,数据文件将移动到表对应的目录中,原来的路径将不存在该文件。在这里使用《Spark编程模型(上)--概念及Shell试验》中在本地操作系统中的搜狗日志数据文件:
hive>LOAD DATA LOCAL INPATH '/home/hadoop/upload/sogou/SogouQ2.txt' INTO TABLE SOGOUQ2;
在/user/hive/warehouse/hive.db/sogouq2目录下,可以看到SougouQ2.txt数据文件:
可以用count关键字查询SogouQ2.txt数据行数,查询时会启动MapReduce进行计算,Map的个数一般和数据分片个数对应,在本查询中有2个Map任务(数据文件有2个Block),1个Reduce任务。
hive>select count(*) from SOGOUQ2;
可以用like关键字进行模糊查询,Map的个数一般和数据分片个数对应。
hive>select count(*) from SOGOUQ2 where WEBSITE like '%baidu%';
hive>select count(*) from SOGOUQ2 where S_SEQ=1 and C_SEQ=2 and WEBSITE like '%baidu%';
第一步 在HDFS创建外部表存放数据目录
$hadoop fs -mkdir -p /class5/sogouq1
$hadoop fs -ls /class5
第二步 在Hive创建外部表,指定表存放目录
hive>CREATE EXTERNAL TABLE SOGOUQ1(DT STRING,WEBSESSION STRING,WORD STRING,S_SEQ INT,C_SEQ INT,WEBSITE STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' STORED AS TEXTFILE LOCATION '/class5/sogouq1';
hive>show tables;
观察一下创建表和外部表的区别,会发现创建外部表多了EXTERNAL关键字以及指定了表对应存放文件夹LOCATION ‘/class5/sogouq1’
【注】在删除表的时候,内部表将删除表的元数据和数据文件;而删除外部表的时候,仅仅删除外部表的元数据,不删除数据文件
第三步 加载数据文件到外部表对应的目录中
创建Hive外部表关联数据文件有两种方式,一种是把外部表数据位置直接关联到数据文件所在目录上,这种方式适合数据文件已经在HDFS存在,另外一种方式是创建表时指定外部表数据目录,随后把数据加载到该目录下。以下将以第二种方式进行演示:
$hadoop fs -copyFromLocal /home/hadoop/upload/sogou/SogouQ1.txt /class5/sogouq1/
$hadoop fs -ls /class5/sogouq1
$hadoop fs -tail /class5/sogouq1/SogouQ1.txt
hive>select count(*) from SOGOUQ1;
hive>select * from SOGOUQ1 limit 10;
可以看出Hive会根据查询不同任务决定是否生成Job,获取前10条并没有生成Job,而是得到数据后直接进行显示。
hive>select count(*) from SOGOUQ1 where S_SEQ=1 and C_SEQ=2;
按照session号进行归组,并按照查询次数进行排序,最终显示查询次数最多的前10条。
hive>select WEBSESSION,count(WEBSESSION) as cw from SOGOUQ1 group by WEBSESSION order by cw desc limit 10;