如何使用Hive进行大数据分析
来自IBM官方网站的一篇文章,Analyzing large datasets with Hive,有关Hive介绍按这里 。文章以电话公司的电话呼叫数据 Call Data Records (CDRs) 为案例进行分析, 呼叫数据有如下:
订户主叫方电话号码subscriberPhone
接收方电话号码recipientPhone
启动时间戳timestamp
通话时间duration
计费的电话号码billingPhone
电话交换设备ID
记录ID
处置或通话(呼叫状态是否繁忙或失败的结果)
所经过的路由交换呼叫进入
所经过的路由交换呼叫离开
呼叫类型(语音,短信等)
另外,在有关通讯底层网络方面还有一份数据network logs,如下:
事件的时间戳dtstamp
IMSI(与蜂窝网络相关的一个唯一的ID)
IMEI(吞吐量的移动电话的一个唯一的ID)
呼叫类型(语音通话,短信等的代码)
细胞类型(代码类型的蜂窝塔记录此信息)
小区ID(ID记录此信息的蜂窝塔)
订户电话号码
纬度(地理坐标塔)
经度(地理坐标塔)
下面我们可以通过Hive将 A (CDR) 和 B (network logs)两份数据结合起来分析。能够得到哪个手机信号塔发出大量调用?另外一个重要分析是获知基站在一天中不同时间的运作模式,以及哪些集线器连接最多的电话呼叫。
我们建立一个表correlation来收集CDR和network两份数据,通过如下Hive创建表:
hive> create table correlation(
timestamp string, subscriberPhone string, \
recipientPhone string, duration int, \
billingPhone string, exchangeID string, \
recordID string, callResult string, \
entryRoute string, exitRoute string, \
callType string, dtstamp string, \
minute int, second int, \
IMSI string, IMEI string, \
callType string, cellType string, \
cellID string, subscriberPhone string, \
cellLat string, cellLon string) \
partitioned by (dt string, hour int) \
location '/mnt/user/hive/warehouse/correlation'
该表的分区partitioned是以时间为标识,当我们向该表插入数据时,注意 partitioned,如下是使用Hive的Join语法将CDR和network两份数据按照一定条件筛选后插入该表。
使用Inner内联Join语法如下:
hive> insert overwrite table correlation \
partition(dt=20130101, hour=12) \
select cdr.timestamp, cdr.subscriberPhone, \
cdr.recipientPhone, cdr.duration, \
cdr.billingPhone, cdr.exchangeID, \
cdr.recordID, cdr.callResult, \
cdr.entryRoute, cdr.exitRoute, \
cdr.callType, \
net.dtstamp, net.minute \
net.second, net.IMSI, \
net.IMEI, net.callType, \
net.cellType, net.cellID, \
net.subscriberPhone, net.cellLat, \
net.cellLon \
from cdr join net\
on (cdr.subscriberPhone = net.subscriberPhone) \
where combine(net.dtstamp, \
net.hour, \
net.minute, \
net.second) <= cdr.timestamp \
and cdr.timestamp like '2013010112% \
and net.dtstamp like '20130101' \
and net.hour = 12;
这条语句是选择性的插入数据,这个选择条件是network的数据时间要小于等于CDR的时间。
注意这里有一个combine函数,这是Hive的UDF。
下面我们将使用Hive UDF( user-defined function)来定义上述条件的combine, UDF是用户自己定义优化的功能函数,通过用户导入到Hive的command-line interface (CLI),然后能够反复使用,一般这个函数是一个Java class
这里UDF被定义成combine(), 将日期 小时 分钟和秒组合成格式:yyyyMMddHHMMSS. DateCombiner UDF Java 类如下.
package HiveUDF;
import org.apache.hadoop.hive.ql.exec.UDF;
public final class DateCombiner extends UDF (
public String evaluate(final String dt, final String hh, final String mm,
final String ss) {
it(dt==null) { return null; }
String ho="", mi="", se="",
if(hh.length() != 2) { ho = "0".concat(hh); } else { ho = hh; }
if(mm.length() != 2) { mi = "0".concat(mm); } else { mi = mm; }
if(ss.length() != 2) { se = "0".concat(ss); } else { se = ss; }
return new String(dt + ho + mi + se);
}
}
继承GenericUDF性能更好些。支持懒加载等。
打包:
$javac -cp /apps/hive/lib/hive-exec-0.7.1-cdh3u3.jar DateCombiner.java
$ jar cf HiveUDF.jar HiveUDF/
将jar包加入Hive CLI:
hive> add jar /home/verrami1/work/JARS/HiveUDF.jar;
hive> create temporary function combine as 'HiveUDF.DateCombiner';
这样前面Where语句中combine函数将执行我们自己定义的方法。