想要从日志数据中分析一下操作系统、浏览器、版本号使用情况。可是hive中的函数不能直接解析useragent,于是能够写一个UDF来解析。useragent用于表示用户的当前操作系统,浏览器版本号信息,形如:

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 180.173.196.29

当中解析ua能够用一个开源的工具包,叫做useragentutils.jar来处理,可是不能直接引入这个包,由于hadoop和hive都不支持直接引用第三方的包,要导入源代码。项目结构应该例如以下图

以下的代码用来打印出操作系统、浏览器版本号信息:

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text; import eu.bitwalker.useragentutils.UserAgent; public class ParseUserAgent_UDF extends UDF{
public Text evaluate(final Text userAgent){
StringBuilder builder = new StringBuilder();
UserAgent ua = new UserAgent(userAgent.toString());
builder.append(ua.getOperatingSystem()+"\t"+ua.getBrowser()+"\t"+ua.getBrowserVersion());
return new Text(builder.toString());
}
}

使用:打成jar包,hive中add jar xx.jar;

create temporary function ua_parse as 'com.xx.ParseUserAgent_UDF';

select ua_parse(ua) from table_name limit 3;

结果:

WINDOWS_7       CHROME21        21.0.1180.89

WINDOWS_7       CHROME33        33.0.1750.146

WINDOWS_7       CHROME21        21.0.1180.89

此种方式仅仅能处理一行。生成一行,无法进行统计分析。

以下使用UDTF(User Defined Table Generating Function),处理一行,生成多列。

import java.util.ArrayList;

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; import eu.bitwalker.useragentutils.UserAgent; public class ParseUserAgent_UDTF extends GenericUDTF{
@Override
public StructObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException {
if (args.length != 1) {
throw new UDFArgumentLengthException("ExplodeMap takes only one argument");
}
if (args[0].getCategory() != ObjectInspector.Category.PRIMITIVE) {
throw new UDFArgumentException("ExplodeMap takes string as a parameter");
}
ArrayList<String> fieldNames = new ArrayList<String>();
ArrayList<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>();
fieldNames.add("system");
fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
fieldNames.add("browser");
fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
fieldNames.add("version");
fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
}
@Override
public void process(Object[] arg){
try {
if(arg == null || arg.length == 0)
return;
String input = arg[0].toString();
String result[] = ua_parse(input).split("\t");
forward(result);
} catch (Exception e) {
e.printStackTrace();
}
} @Override
public void close() throws HiveException { }
public String ua_parse(String userAgent){
StringBuilder builder = new StringBuilder();
UserAgent ua = new UserAgent(userAgent.toString());
builder.append(ua.getOperatingSystem()+"\t"+ua.getBrowser()+"\t"+ua.getBrowserVersion());
return builder.toString();
}
}
select t.browser,count(*) c from (select ua_parse(ua) as (system,browser,version) from table_name) t group by t.browser order by c desc;

前十名:

CHROME31        987220571

UNKNOWN 708890045

IE8     420021677

IE7     411500373

MOBILE_SAFARI   291920740

IE6     217574865

IE11    179582201

IE9     165160040

CHROME30        158623163

CHROME21        155192489

未识别的还是非常多!

參考:http://blog.csdn.net/ruidongliu/article/details/8791865

http://computerdragon.blog.51cto.com/6235984/1288567

最新文章

  1. VS2010+C#+EmguCV 配置详解
  2. inner join on 和 where = 的区别!
  3. 大数据量下,分页的解决办法,bubuko.com分享,快乐人生
  4. tableview详细介绍
  5. Socket.IO – 基于 WebSocket 构建跨浏览器的实时应用
  6. slidingMenu有时候需要关闭侧边栏
  7. openssl实践总结
  8. ubuntu中一些配置文件含义
  9. 20150618_Andriod _KSOAP2_多线程
  10. Android ViewPager 应该及技巧
  11. C++使用类型代替枚举量
  12. UI元素的相对自适应
  13. Oracle学习笔记(2)——过程和函数
  14. Android源代码学习之六——ActivityManager框架解析
  15. CSS选择器 - 性能的探究及提升
  16. ssh远程登录,禁止root登录
  17. 使用Kubernetes需要注意的一些问题(FAQ of k8s)
  18. 开发人员的必备工具Git(初级)
  19. Python:Day26 socket
  20. GuGuFishtion HDU - 6390 (杭电多校7E)

热门文章

  1. phing用户手册第四章Getting Started译文
  2. unable to load default svn client 和 Eclipse SVN 插件与TortoiseSVN对应关系
  3. [Cocos2d-x]节点的生命周期
  4. Linux ssh密钥自动登录(转)
  5. A Game of Thrones(16) - Edard
  6. HDU 4643 GSM 简单计算几何
  7. Nginx 进程间通信
  8. Wix打包系列(七) 添加系统必备组件的安装程序
  9. 一次失败的刷题经历:[LeetCode]292之尼姆游戏(Nim Game)(转)
  10. Linux内核——进程管理与调度