hive 学习系列四(用户自定义函数)

如果入参是简单的数据类型,直接继承UDF,实现一个或者多个evaluate 方法。

具体流程如下:

1,实现大写字符转换成小写字符的UDF

package com.example.hive.udf;

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

public class Lower extends UDF {
    public Text evaluate(final Text s) {
        if (s == null) {
            return null;
        }
        return new Text(s.toString().toLowerCase());
    }
}

2,打包成jar 包。

建立maven 项目,使用maven 打包。

这里打包成的jar 包是,hiveudf-1.0.0.jar

3,上传到hdfs 路径上。

[[email protected]master /opt]# hadoop fs -mkdir -p /user/hive/udf
18/06/07 09:41:09 WARN util.NativeCodeLoader: Unable
to load native-hadoop library for your platform... using builtin-java classes where applicable
[[email protected] /opt]# hadoop fs -put hiveudf-1.0.0.jar  /user/hive/udf
18/06/07 09:41:24 WARN util.NativeCodeLoader: Unable to
load native-hadoop library for your platform... using builtin-java classes where applicable
[[email protected] /opt]# hadoop fs -ls /user/hive/udf
18/06/07 09:41:47 WARN util.NativeCodeLoader: Unable to load native-hadoop library
 for your platform... using builtin-java classes where applicable
Found 1 items
-rw-r--r--   3 root supergroup       8020 2018-06-07 09:41 /user/hive/udf/hiveudf-1.0.0.jar
[[email protected] /opt]#

4, 在Hive 命令行里面创建函数。

add jar hdfs:////udf/hiveudf-1.0.0.jar;
create temporary function lower as ‘com.example.hive.udf.Lower‘;

hive> delete jar  hiveudf-1.0.0.jar;
hive> list jars
    > ;
hive> add jar hdfs:///user/hive/udf/hiveudf-1.0.0.jar
    > ;
Added [/tmp/416cfcca-9ea0-4eaf-9e54-8154b440f3a9_resources/hiveudf-1.0.0.jar] to class path
Added resources: [hdfs:///user/hive/udf/hiveudf-1.0.0.jar]
hive> list jars;
/tmp/416cfcca-9ea0-4eaf-9e54-8154b440f3a9_resources/hiveudf-1.0.0.jar
hive> create temporary function lower as ‘com.example.hive.udf.Lower‘;
OK
Time taken: 0.594 seconds
hive> 

5,然后就可以用这个注册的函数了。

hive> select lower(‘AbcDEfg‘)
    > ;
OK
abcdefg
Time taken: 1.718 seconds, Fetched: 1 row(s)
hive>

至于入参是复杂数据类型,比如Array 等, 可以继承GenericUDF

1,同样的,先写一个类,继承GenericUDF,

此自定义函数实现的是,把一个点,根据经纬度,转换成一个字符串。

package com.zbra.udf;

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.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.DoubleObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;

/**
 * 针对复杂数据
 */
public class GeoUdf extends GenericUDF {

    private DoubleObjectInspector doubleObjectInspector01;
    private DoubleObjectInspector doubleObjectInspector02;

    public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
        if (objectInspectors.length != 2) {
            throw new UDFArgumentLengthException("arrayContainsExample only takes 2 arguments: String,  String");
        }
        // 1. 检查是否接收到正确的参数类型
        ObjectInspector a = objectInspectors[0];
        ObjectInspector b = objectInspectors[1];
        if (!(a instanceof DoubleObjectInspector) || !(b instanceof DoubleObjectInspector)) {
            throw new UDFArgumentException("first argument must be a double, second argument must be a double");
        }

        this.doubleObjectInspector01 = (DoubleObjectInspector) a;
        this.doubleObjectInspector02 = (DoubleObjectInspector) b;

        return PrimitiveObjectInspectorFactory.javaStringObjectInspector;
    }

    public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {

        Double lat = this.doubleObjectInspector01.get(deferredObjects[0].get());
        Double lng = this.doubleObjectInspector02.get(deferredObjects[1].get());

        if (lat == null || lng == null) {
            return new String("");
        }

        return new GeoHash(lat, lng).getGeoHashBase32();
    }

    public String getDisplayString(String[] strings) {
        if (strings.length == 2) {
            return "geo_hash(" + strings[0] + ", " + strings[1] + ")";
        } else {
            return "传入的参数不对...";
        }
    }
}

2,打包成jar 包

本文中打包成hiveudf-1.0.0.jar

3,同样的上传到hdfs 路径中

[[email protected] /opt]# hadoop fs -mkdir -p /user/hive/udf
18/06/07 09:41:09 WARN util.NativeCodeLoader: Unable
to load native-hadoop library for your platform... using builtin-java classes where applicable
[[email protected] /opt]# hadoop fs -put hiveudf-1.0.0.jar  /user/hive/udf
18/06/07 09:41:24 WARN util.NativeCodeLoader: Unable to
load native-hadoop library for your platform... using builtin-java classes where applicable
[[email protected] /opt]# hadoop fs -ls /user/hive/udf
18/06/07 09:41:47 WARN util.NativeCodeLoader: Unable to load native-hadoop library
 for your platform... using builtin-java classes where applicable
Found 1 items
-rw-r--r--   3 root supergroup       8020 2018-06-07 09:41 /user/hive/udf/hiveudf-1.0.0.jar
[[email protected] /opt]#

4, 创建自定义函数。

hive> list jars;
/tmp/3794df3a-687a-45dd-93d3-d6a712c43e85_resources/hiveudf-1.0.0.jar
hive> delete jar /tmp/3794df3a-687a-45dd-93d3-d6a712c43e85_resources/hiveudf-1.0.0.jar
    > ;
Deleted [/tmp/3794df3a-687a-45dd-93d3-d6a712c43e85_resources/hiveudf-1.0.0.jar] from class path
hive> add jar hdfs:///user/hive/udf/hiveudf-1.0.0.jar;
Added [/tmp/3794df3a-687a-45dd-93d3-d6a712c43e85_resources/hiveudf-1.0.0.jar] to class path
Added resources: [hdfs:///user/hive/udf/hiveudf-1.0.0.jar]
hive> create temporary function geohash as ‘com.zbra.udf.GeoUdf‘;
OK
Time taken: 0.145 seconds

5, 使用如下:

hive> select geohash(12.0d, 123.0d);
OK
wdpkqbtc
Time taken: 0.8 seconds, Fetched: 1 row(s)
hive> select geohash(cast(‘12‘ as Double), cast(‘123‘ as Double));
OK
wdpkqbtc
Time taken: 0.733 seconds, Fetched: 1 row(s)
hive> 

原文地址:https://www.cnblogs.com/unnunique/p/9362103.html

时间: 2024-10-09 04:23:08

hive 学习系列四(用户自定义函数)的相关文章

hive学习系列2——环境安装

1.hive的安装  (1)解压缩.重命名.设置环境变量,参考hadoop1学习系列2 (2)在目录$HIVE_HOME/conf/下,执行命令mv hive-default.xml.template  hive-site.xml重命名     在目录$HIVE_HOME/conf/下,执行命令mv hive-env.sh.template  hive-env.sh重命名 (3)修改hadoop的配置文件hadoop-env.sh,修改内容如下:     export HADOOP_CLASSP

hive学习系列1——Mysql安装

安装mysql (1)执行命令 rpm -qa |grep mysql 查看mysql是否安装     删除linux上已经安装的mysql相关库信息. rpm  -e  xxxxxxx(查看的库名,可使用右键复制)   --nodeps     执行命令 rpm -qa |grep mysql 检查是否删除干净 (2)执行命令  rpm -i   mysql-server-********  安装mysql服务端 (3)启动mysql 服务端,执行命令  后台运行 mysqld_safe &

Hive学习之自定义聚合函数

Hive支持用户自定义聚合函数(UDAF),这种类型的函数提供了更加强大的数据处理功能.Hive支持两种类型的UDAF:简单型和通用型.正如名称所暗示的,简单型UDAF的实现非常简单,但由于使用了反射的原因会出现性能的损耗,并且不支持长度可变的参数列表等特征.而通用型UDAF虽然支持长度可变的参数等特征,但不像简单型那么容易编写. 这篇文章将学习编写UDAF的规则,比如需要实现哪些接口,继承哪些类,定义哪些方法等, 实现通用型UDAF需要编写两个类:解析器和计算器.解析器负责UDAF的参数检查,

Identity Server4学习系列四之用户名密码获得访问令牌

1.简介 Identity Server4支持用户名密码模式,允许调用客户端使用用户名密码来获得访问Api资源(遵循Auth 2.0协议)的Access Token,MS可能考虑兼容老的系统,实现了这个功能,但是不建议这么做. 2.实战一服务端配置 接着Identity Server4学习系列三的基础上,直接扩展里面的项目代码,让服务端同时支持密钥认证和用户名密码认证 第一步:扩展ThirdClients类,如下: /// <summary> /// 配置可以访问IdentityServer4

Vue学习系列(四)——理解生命周期和钩子

前言 在上一篇中,我们对平时进行vue开发中遇到的常用指令进行归类说明讲解,大概已经学会了怎么去实现数据绑定,以及实现动态的实现数据展示功能,运用指令,可以更好更快的进行开发.而在这一篇中,我们将通过实例,探究vue的生命周期. 万物皆有灵,世间万物都拥有灵魂,小到山河湖海,花草树木,蚂蚁到人类,以及所有的动植物,大到地球星空和宇宙,都拥有灵魂,可以说他们都是有生命的,只是他们的生命形态是我们人类所不能理解的存在.在生产中,生命周期通俗来讲,就是从自然中来回到自然中去的全过程,也就是从采集材料设

[jQuery学习系列四 ]4-Jquery学习四-事件操作

前言:今天看知乎偶然看到中国有哪些类似于TED的节目, 回答中的一些推荐我给记录下来了, 顺便也在这里贴一下: 一席 云集 听道 推酷 青年中国说 SELF格致论道 参考:http://www.365mini.com/page/tag/jquery-event-methods 1,readyready()函数用于在当前文档结构载入完毕后立即执行指定的函数.该函数的作用相当于window.onload事件. 2,blindbind()函数用于为每个匹配元素的一个或多个事件绑定事件处理函数.举例:

Android SDK范例源码学习系列四 AppNavigation

 (本系列基于Jelly Bean,Android OS4.2,API 17版本) 就算是最简单的应用程序也会拥有不止一项功能,因此我们经常要应对多个Activity.主Activity随应用程序启动而启动,可以通过触发事件开启另外的Activity.要想激活应用中的某个特定组件,可以用显式命名的Intent来实现,也可以采用隐式Intent,尽可能选用隐式的,它能为模块化功能提供强大的框架. 隐式Intent不需要指定要使用哪个组件,它们通过过滤器指定所需的功能,而Android系统必须决定使

Hive 学习(四) Hive的数据类型

一, 数字类型 二,日期时间类型 三,字符串类型 四,混杂类型 五,复合类型 5.1 array数据类型 5.2 map类型 5.3 struct类型 正文 一, 数字类型 如下表所示: 实例: create table t_test(a string ,b int,c bigint,d float,e double,f tinyint,g smallint) 二,日期时间类型 示例:有如下数据: 1,zhangsan,1985-06-30 2,lisi,1986-07-10 3,wangwu,

javascript学习第四课函数

常用函数方式示例: 注意:虽然函数支持嵌套调用,但尽量少用好一些. 简单的效率测试方法: 函数的作用域示例,三种生成函数对比: 函数的形参与实参: 小结: