做完Hive分析后,怎么让普通用户通过web界面访问你的分析结果? 最直接的办法是将分析结果存为另一张Hive表,然后让web应用通过hive jdbc连接这张表。
这种做法的坏处是:Hive结果表在被查询时会临时起MapReduce任务,这对快速返回查询结果不利;如果结果表本身比较大、并且查询方式本身还有点复杂的话,那响应就更慢了,因为Hive对查询的优化能力跟RDBMS没法比。
所以最好把hive结果表再通过sqoop导入到rdbms的一张表中,以适应OLTP环境下的各种查询。
这里以日志分析为例。 假设你拿到了若干很大的日志文件并已存为Hive表,业务方要求你返回总的访问次数、总的访问用户数、访问次数最多的10个用户
第一步当然是对Hive日志表进行分析。由于用户数并非海量,所以结果表可以存成<user_name_id, visit_count>这种格式,最好再导到RDBMS中
create table visiting_user (usernameid string, visitcount int); --创建Hive结果表 insert overwrite table visiting_user -- 统计分析 select usernameid, visitcount from (select usernameid, count(*) as visitcount from coupon11_log group by usernameid) stats order by visitcount desc limit 10;
然后把Hive结果表导入mysql
create table visiting_user (usernameid varchar(50), visitcount int); --在mysql中创建结果表
$sqoop export --connect jdbc:mysql://localhost/kent --username kent --password *** --table visiting_user --verbose --export-dir /user/hive/warehouse/visiting_user/ --input-fields-terminated-by '\0001' ##\0001是Hive的默认列分隔符
最后去mysql里做二次查询
select sum(visitcount) from visiting_user ; --总的访问数 select count(*) from visiting_user ; --总的用户数 select * from visiting_user order by visitcount desc; --访问次数最多的10个用户