在用hive做nginx日志url 分析的时候,经常需要parse url。
hive中自带的函数parse_url可以实现这个功能,不过它对格式的要求比较严格,不能直接用于nginx log的request字段。

1
2
hive -e "select parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST') from dual"
facebook.com

1
2
hive -e "select parse_url('facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST') from dual"
NULL

也可以通过regexp_extract来实现,不过需要写正则,同时性能也有些问题。。

1
2
hive -e "select regexp_extract('GET /vips-mobile/router.do?api_key=24415b921531551cb2ba756b885ce783&app_version=1.8.6&fields=sku_id HTTP/1.1','.+? +(.+?)app_version=(.+?)&(.+) .+?',2) from dual"
1.8.6

考虑自己写一个,借鉴parse_url的udf:
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package com.hive.myudf;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.hadoop.hive.ql.exec.UDF;
public class UDFNginxParseUrl extends UDF {
  private String schemal = "http://";
  private String host1 = null;
  private Pattern p1 = null;
  private URL url = null;
  private Pattern p = null;
  private String lastKey = null;
  public UDFNginxParseUrl() {
  }
  public String evaluate(String host1, String urlStr, String partToExtract) {
    if (host1 == null || urlStr == null || partToExtract == null) {
      return null;
    }
     p1 = Pattern.compile("(.+?) +(.+?) (.+)");
     Matcher m1 = p1.matcher(urlStr);
     if (m1.matches()){
          String realUrl = schemal + host1 + m1.group(2);
          System.out.println("URL is " + realUrl);
          try{
               url = new URL(realUrl);
          }catch (Exception e){
               return null;
          }
                                              
     }
     /*
    if (lastUrlStr == null || !urlStr.equals(lastUrlStr)) {
      try {
        url = new URL(urlStr);
      } catch (Exception e) {
        return null;
      }
    }
    lastUrlStr = urlStr;
     */
    if (partToExtract.equals("HOST")) {
      return url.getHost();
    }
    if (partToExtract.equals("PATH")) {
      return url.getPath();
    }
    if (partToExtract.equals("QUERY")) {
      return url.getQuery();
    }
    if (partToExtract.equals("REF")) {
      return url.getRef();
    }
    if (partToExtract.equals("PROTOCOL")) {
      return url.getProtocol();
    }
    if (partToExtract.equals("FILE")) {
      return url.getFile();
    }
    if (partToExtract.equals("AUTHORITY")) {
      return url.getAuthority();
    }
    if (partToExtract.equals("USERINFO")) {
      return url.getUserInfo();
    }
    return null;
  }
  public String evaluate(String host, String urlStr, String partToExtract, String key) {
    if (!partToExtract.equals("QUERY")) {
      return null;
    }
    String query = this.evaluate(host, urlStr, partToExtract);
    if (query == null) {
      return null;
    }
    if (!key.equals(lastKey)) {
      p = Pattern.compile("(&|^)" + key + "=([^&]*)");
    }
    lastKey = key;
    Matcher m = p.matcher(query);
    if (m.find()) {
      return m.group(2);
    }
    return null;
  }
}

add jar和create function之后测试:

1
2
hive -e "select nginx_url_parse('test.test.com','GET /vips-mobile/router.do?api_key=24415&app_version=1.8.6&fields=sku_id HTTP/1.1','HOST') FROM dual;"
test.test.com

1
2
hive -e "select nginx_url_parse('test.test.com','GET /vips-mobile/router.do?api_key=24415&app_version=1.8.6&fields=sku_id HTTP/1.1','QUERY','api_key') FROM dual;"
24415

这样就可以直接应用于nginx的日志了。

本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1350463,如需转载请自行联系原作者

自定义hive url parse函数相关推荐

  1. Hive 内置函数及自定义函数

    1.内置函数 使用如下命令查看当前hive版本支持的所有内置函数 show functions; 部分截图: 可以使用如下命令查看某个函数的使用方法及作用,比如查看 upper函数 desc func ...

  2. 大数据入门教程系列之Hive内置函数及自定义函数

    本篇文章主要介绍Hive内置函数以及自定义UDF函数和UDFT函数,自定义UDF函数通过一个国际转换中文的例子说明. 操作步骤: ①.准备数据和环境 ②.演示Hive内置函数 ③.自定义UDF函数编写 ...

  3. hive 的udf 函数使用

    1)依据课程讲解UDF编程案例,完成练习,总结开发UDF步骤,代码贴图,给予注释,重点 2)更改emp 表中名字的大写给为小写. 一:hive 的udf 函数: 1.1 hive UDF 函数概述: ...

  4. hive udaf_Hive UDAF 函数的编写

    UDAF是Hive中用户自定义的聚集函数,Hive内置UDAF函数包括有sum()与count(),UDAF实现有简单与通用两种方式,简单UDAF因为使用Java反射导致性能损失,而且有些特性不能使用 ...

  5. hive内置函数_Hive Query生命周期 —— 钩子(Hook)函数篇

    无论你通过哪种方式连接Hive(如Hive Cli.HiveServer2),一个HQL语句都要经过Driver的解析和执行,主要涉及HQL解析.编译.优化器处理.执行器执行四个方面. 以Hive目前 ...

  6. Hive内置函数与常用函数汇总

    目录 Hive内置函数汇总 字符函数(字符串操作) 数学函数 集合函数 类型转换函数 日期函数 条件函数 聚合函数 表生成函数 辅助功能类函数 数据屏蔽函数(从Hive 2.1.0开始) Hive常用 ...

  7. clickhouse 常用函数 算数函数 时间函数 日期函数 字符串函数 比较函数 数据类型函数 逻辑函数 类型转换函数 替换函数 数组函数 随机函数 编码函数 UUID URL IP 函数

    clickhouse 常用函数 算数函数 时间函数 日期函数 字符串函数 比较函数 数据类型函数 逻辑函数 类型转换函数 替换函数 数组函数 随机函数 编码函数 UUID URL IP 函数 算数函数 ...

  8. 2021年大数据Hive(七):Hive的开窗函数

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive的开窗函数 一.窗口函数 ROW_NUMBER,RANK ...

  9. Hive 正则匹配函数 regexp_extract

    Hive 正则匹配函数 regexp_extract 1.regexp_extract 语法:    regexp_extract(string subject,  string pattern,   ...

最新文章

  1. 满洲里市智慧教育建设跨入云时代
  2. 推荐10款来自极客标签的超棒前端特效[第五期]
  3. 账号类型_3-2-3节 文字创作类之账号类型
  4. Docker最全教程之使用.NET Core推送钉钉消息(二十)
  5. Java多线程的4种实现方式
  6. 大牛深入讲解!9次Java面试经验总结
  7. 五年来,开源论坛软件MyBB共修复100多个漏洞
  8. 关于元器件选型需要注意的问题
  9. 在Windows上将Ctrl+C信号发送到Python subprocess子进程
  10. python chardet_【已解决】windows下,安装python的chardet
  11. 计算机网络从使用对象上划分为,计算机网络练习题卷1-2章.doc
  12. html 列表实现展开和收起,实现列表展开收起效果
  13. Oracle nlssort()中文排序
  14. 一文带你了解推荐系统常用模型及框架
  15. DongDong认亲戚
  16. 小米MIUI线刷包cust.img、system.img精简教程(二)
  17. MySQL数据库比较工具 - mysqldbcompare
  18. 开源项目Krita学习(一)
  19. kindle操作:传输下载的书籍、更改书籍封面
  20. 【RL系列】Multi-Armed Bandit问题笔记

热门文章

  1. 熟悉Qt开发环境--Hello Qt
  2. PrincipleCTEbook
  3. 关于搜狐焦点房产的数据分析
  4. 使用谷歌浏览器模拟微信(android或ios)浏览器
  5. Java servlet 实现的简易购物车
  6. BootStrap 提示框
  7. Effective Java阅读笔记——引言
  8. freemarker模板引擎 常用标签
  9. Heu OJ 解题报告索引
  10. js+正文规则 高亮搜索关键字(二)