IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Hive UDF - Java和Python的详细实现 -> 正文阅读

[大数据]Hive UDF - Java和Python的详细实现

作者:recommend-item-box type_blog clearfix

一 写在前面

Hive的自定义函数(User-Defined Functions)分三类:

  • UDF:one to one,进一出一,row mapping。是row级别操作,类似upper、substr等
  • UDAF:many to one,进多出一,row mapping。是row级别操作,类似sum、min等
  • UDTF:one to many ,进一出多。类似:alteral view与explode实现的一行变多行

接下来写一个统计统计字段长度的UDF

二 JAVA实现

1、UDF函数编写

1.1 前期准备

  1. 在IntelliJ IDEA里新建一个Maven项目
  2. 在pom.xml引入hive的依赖(注意版本号)
        <dependencies>
            <dependency>
                <groupId>org.apache.hive</groupId>
                <artifactId>hive-exec</artifactId>
                <version>3.1.2</version>
            </dependency>
        </dependencies>

    3.新建一个类(com.zhs.udf.FirstUDF)

1.2 FirstUDF代码的代码

package com.zhs.udf;

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
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.PrimitiveObjectInspectorFactory;

// extends 表示继承类。UDF需要继承GenericUDF
public class FirstUDF extends GenericUDF {

    @Override

    // ObjectInspector接口使得Hive可以不拘泥于一种特定数据格式, 使得数据流在输入端和输出端切换不同的格式
    // UDF的初始化方法,主要用于验证输入参数的数据类型及输入参数的个数,返回值为ObjectInspector类型
    public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {

        if (objectInspectors.length != 1){
            throw new UDFArgumentException("参数个数不为1");
        }

        // 基本类型的OI实例由工厂类 PrimitiveObjectInspectorFactory 创建
        // 其它类型的OI实例由工厂类 ObjectInspectorFactory 创建
        return PrimitiveObjectInspectorFactory.javaIntObjectInspector;
    }

    @Override
    // 当UDF被调用时,对每行的数据进行逻辑处理
    // DeferredObject 是封装的数组格式
    public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {

        // 1.取出输入数据
        String input = deferredObjects[0].get().toString();

        // 2.判断数据数据是否为null
        if (input == null) {
            return 0;
        }

        // 3.返回输入数据的长度
        return input.length();
    }

    @Override
    // 展示方法,主要用于打印UDF的一些基本信息,如MR的执行计划,一般返回空即可
    public String getDisplayString(String[] strings) {

        return "";
    }
}

1.3 打包

2、上传Jar包

Tips1: UDF使用的jdk版本最好与Hadoop集群使用的jdk版本相同

Tips2: 可以使用Xftp将本地jar包上传到安装hive的虚拟机/远程服务器上

2.1 如果是临时用,可以上传到任一目录下

2.2 如果是永久用,需要把jar包上传到hdfs的lib目录下

-- 第一步
把jar包先上传到了/home/zhs/Documents/hive-demo-1.0-SNAPSHOT.jar路径下

-- 第二步
-- 1 可以看看有没有lib目录
hadoop fs -ls /lib
-- 2 如果没有,则在hadoop上创建lib目录
hadoop fs -mkdir /lib
-- 3 把jar复制到lib目录下
hadoop fs -put /home/zhs/Documents/hive-demo-1.0-SNAPSHOT.jar /lib/
-- 4 可以再看下有没有复制成功
hadoop fs -mkdir /lib

3、添加jar包到hive环境中(临时函数需要,永久函数不需要这步)

Tips:通过该方式添加的jar文件只存在于当前会话中,当会话关闭后不能够继续使用

// 先启动hive
// 语法:add jar +jar包所在的目录/jar包名字;
// /home/zhs/Documents/是jar包上传的目录
add jar /home/zhs/Documents/hive-demo-1.0-SNAPSHOT.jar;

4、临时函数

// 创建临时函数
// 语法:CREATE TEMPORARY FUNCTION function_name AS class_name;
// class_name 就是类名+包名
create temporary function my_len as "com.zhs.udf.FirstUDF"

// 销毁临时函数
// 语法:DROP TEMPORARY FUNCTION [IF EXISTS] function_name; 
drop temporary function my_len ;

5、永久函数

create function my_len as "com.zhs.udf.FirstUDF" 
using jar 'hdfs://localhost:9000/lib/hive-demo-1.0-SNAPSHOT.jar';

6、调用/测试

select my_len("zhs");
-- 返回结果是 3

三 Python实现

就是试了试可以用,但真正的实战意义还没有琢磨

1、创建my_len.py并编写函数

practice.sc表如下:

# -*- coding: utf-8 -*-
import sys

for line in sys.stdin:
    detail = line.strip().split(",")
    sid = detail[0]
    cid = detail[1]
    socre = detail[2]

    len_sid = len(sid)
    len_cid = len(cid)
    len_socre = len(socre)

    len_list = (str(len_sid),str(len_cid),str(len_socre))

    print("\t".join(len_list))

2、上传脚本

/home/zhs/Documents/my_len.py?

3、添加py脚本hive环境中

add jar /home/zhs/Documents/my_len.py;

4、调用

SELECT TRANSFORM (sid,cid,score)
USING 'python3 /home/zhs/Documents/my_len.py'
AS (len1,len2,len3)
FROM practice.sc;

输出示例

?

?

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-31 16:42:40  更:2021-07-31 16:43:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 19:38:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码