大数据主题

如何使用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函数将执行我们自己定义的方法。

   

 

大数据专题