自定义UDF解析IP地址获取 省份/城市+HDP集群TEZ报错问题

  •  编写UDF解析IP段落属于哪个身份城市(公司给了一份IP地址库格式大致如下)
18620416|18628607|内蒙古|呼和浩特
18628608|18629631|内蒙古|呼和浩特
18629632|18630655|内蒙古|呼和浩特
18630656|18631679|内蒙古|呼和浩特
18631680|18632703|内蒙古|包头
18632704|18634751|内蒙古|乌海
18634752|18636799|内蒙古|呼和浩特
18636800|18637823|内蒙古|乌兰察布
18637824|18640895|内蒙古|呼和浩特
18640896|18641919|内蒙古|包头
18641920|18642943|内蒙古|内蒙古
18642944|18643967|内蒙古|呼和浩特
18643968|18644479|内蒙古|鄂尔多斯
18644480|18644735|内蒙古|乌海
18644736|18644991|内蒙古|阿拉善盟
18644992|18646015|内蒙古|呼和浩特
18646016|18647039|内蒙古|呼和浩特
18647040|18648063|内蒙古|呼和浩特
18648064|18649087|内蒙古|乌兰察布
  • 接下来用eclipse-jee-juno-SR2按照fatjar开始创建udf工程

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>hiveudf</groupId>
  <artifactId>hiveudf</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>hiveudf</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
 <dependency>
	<groupId>org.apache.hive</groupId>
	<artifactId>hive-exec</artifactId>
	<version>1.1.0</version>
	</dependency>
	<dependency>
	<groupId>org.apache.hadoop</groupId>
	<artifactId>hadoop-client</artifactId>
	<version>2.6.0</version>
	</dependency>
  </dependencies>
</project>
package com;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

public class IpConversion extends UDF{
	public static long ip2long(String ip) {

        String[] ips = ip.split("[.]");
        long ipNum = 0;
        if (ips == null) {
            return 0;
        }
        for (int i = 0; i < ips.length; i++) {
            ipNum = ipNum << Byte.SIZE | Long.parseLong(ips[i]);
        }

        return ipNum;
    }
    public long evaluate(String ip) {
        if (ip.matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}")) {
            try {
                long ipNum = ip2long(ip);
                return ipNum;
            } catch (Exception e) {
                return 0;
            }
        } else {
            return 0;
        }
    }

}
  • 1.描述

    用java开发UDF打包成功放入hdp08140(HDP)的集群hive上运行。创建jar包成功,创建函数成功

下一步运行HQL 执行mapreduce程序出现报错如下

  • 同时只要创建了这个jar包和函数之后 运行任何mapreduce 程序都会出现同样错误。比如
  • Select count(*) from log_login_info where day=’20171212’
  • 会报错相同的错误,我个人觉得,只是个人觉得跟TEZ 引擎有关系.
  • 注:我在DM集群上用相同的方法是可以查询出来数据 也是可以运行MapReduce的因为DM集群是CDH环境 ,没有使用TEZ引擎。所以也不会暴露出跟TEZ引擎有关系的错误。解决办法:默认为TEZ引擎,更改为普通MR(set hive.execution.engine=mr; )这样的话创建jar之后运行任何都没有问题了。
Administrator

知人不必言尽,留三分余地与人,留些口德与己。 责人不必苛尽,留三分余地与人,留些肚量与己。 才能不必傲尽,留三分余地与人,留些内涵与己。 锋芒不必露尽,留三分余地与人,留些深敛与己。 有功不必邀尽,留三分余地与人,留些谦让与己。

发表评论

电子邮件地址不会被公开。 必填项已用*标注