案例描述,现在mysql里面有如下的表结构与表数据:
search_time:表示某一个时刻
search_text:表示某一个时刻搜索了什么内容
现在的需求是这样子的:要求统计出每一个月的查询总量,需求很简单,在MySQL中可以这样写:
SELECT DATE_FORMAT(search_time,'%Y-%m') yuefen,count(*) totalsearch FROM searchword
GROUP BY DATE_FORMAT(search_time,'%Y-%m')
结果如图:
这没有什么问题,因为数据量比较小,但是如果这个表内容非常大,用mysql分析起来就很慢了,这时候就应想到hive了。这样子,需求就转变到了如何使用hive完成这件事的问题。
一、我格式化下要处理的数据,也就是数据源,并上传到hive所在机器上,命名为search.txt,路径为/root/search.txt内容如下:
2016-01-10 13:11:04 | tomcat
2016-01-18 13:10:11 | cms
2017-08-04 01:59:01 | iframe
2017-08-10 17:58:01 | java内存溢出
2017-08-10 23:01:00 | 慢
2017-09-22 04:59:01 | cms
2017-09-24 22:00:00 | javaweb
2017-09-29 20:52:04 | validate
2017-09-30 14:00:02 | JAVA_OPTS
2017-10-25 10:12:00 | ssh
2017-10-30 07:59:01 | 根目录
2017-10-31 01:00:59 | tomcat
2017-11-24 23:00:00 | java
2017-11-25 06:00:00 | href
2017-11-25 09:01:01 | tar
2017-11-26 01:01:59 | tomcat
2017-11-26 03:04:59 | jdk
2017-11-27 03:00:00 | 环境
2017-11-27 04:00:00 | 5.0
2017-11-27 22:00:00 | svn
2017-12-01 02:56:00 | Java
2017-12-01 04:00:00 | bootstrap table
2017-12-01 21:01:59 | 自动完成
2017-12-04 04:44:23 | jps
2017-12-04 22:22:00 | svn
2017-12-05 07:30:20 | adfds
2017-12-06 04:50:43 | df
2017-12-06 12:02:02 | a
2017-12-15 09:11:41 | 安装
2017-12-21 00:00:12 | tomcat
2017-12-21 00:57:00 | CSS
2017-12-21 07:00:00 | 图片轮播js
2017-12-21 09:20:00 | redis
2017-12-21 21:32:10 | adfsd
二、创建hive数据库:
hive> create database if not exists lzzcmsdb;
OK
Time taken: 0.555 seconds
三、选中要使用的数据库:
hive> use lzzcmsdb;
OK
Time taken: 0.057 seconds
四、hive中创建表:
create table t_searchword(
search_time string,
search_text string
)
row format delimited fields terminated by '|' stored as textfile;
五、把/root/search.txt导入到t_searchword中去:
hive> load data local inpath '/root/search.txt' into table t_searchword;
Loading data to table lzzcmsdb.t_searchword
Table lzzcmsdb.t_searchword stats: [numFiles=1, totalSize=977]
OK
Time taken: 1.512 seconds
六、查看一下,发现没有问题:
七、hive sql也叫做hsql,跟关系型数据的sql没有多大区别,我们把上边统计每个月查询总量的sql改把改把,改为下面的形式:
SELECT from_unixtime(unix_timestamp(search_time),'yyyyMM') yuefen,count(*) totalsearch FROM t_searchword GROUP BY from_unixtime(unix_timestamp(search_time),'yyyyMM');执行吧,看看结果与前边在mysql中得到的结果是否相同:
我们把红框里面的结果跟前边给出的在mysql里面执行的结果比较一下,结果完全相同,用hive成功完成了任务。