[大数据]使用hive做数据分析

前面使用flume把第一手的日志上传到了hadoop

接下来就是要对数据进行分析了,

这里可以使用hadoop的mapreduce,但是缺点是开发过程比较慢

很多人都习惯使用sql来进行查询,hive很好的满足了这个要求

而且根据大公司的精力,之前大家都是使用自己封装的mapreduce库

后来都转成hive了


把hadoop的日志转成hive表就是第一步了

这里我尝试的方案是

外表+json的方式

!---

hive的json处理需要引入第三方serde

http://congiu.net/hive-json-serde/1.3.7/cdh5/ 这里可以直接下载,省去github自己打包的麻烦

下载下来的jar包直接丢到hive的lib文件夹下

(这里还是需要下源码重新打包下,把hive和hadoop的版本做个配置支持,

网站上面只有cdh4,chd5等1,2个版本的支持,版本对不上容易出现莫名其妙的错误

)

上面这个serde稳定性不行,解析经常容易失败,最后换了

https://github.com/cloudera/cdh-twitter-example 这个开源的

'com.cloudera.hive.serde.JSONSerDe'

下载代码后把hive和hadoop的版本做修改再编译


然后就是建立外表的过程

项目的日志格式是/flume/yyyy-mm-dd/h/files

这里使用了日期和时间2个分区参数


建表的语句如下:

建表语句
CREATE EXTERNAL TABLE gatetest(
url string,
ip string,
param struct >,
 agent string,
 logtime string,
 time string,
 type string

PARTITIONED BY (mydate string, myhour string) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION '/flume';


增加分区
alter table gatetest add partition (date='20160427', hour='0') location '/flume/20160427/0';


查看分区数:
show partitions gateLog;


基于分区查询:
select count(*) from gateLog where date='20160427';


这里有个问题是无法直接使用分区参数和数据值一起做为查询条件

这个问题自己还要尝试解决

{解决:

JsonSerDe里面有个配置选项跳过哪些无法解析的json串,测试了一下java的解析跟python解析还有有些不全

我用python导出的3w条记录有几百条无法用这个SerDe解析出来。

ALTER TABLE gatetest SET SERDEPROPERTIES ("ignore.malformed.json"="true");

增加这句,这个是在代码库里面的说明找的。

}






你可能感兴趣的:([大数据]使用hive做数据分析)