java udf for pig_pig 教程及 自定义udf 的java版-Go语言中文社区

2024-02-23 21:50

本文主要是介绍java udf for pig_pig 教程及 自定义udf 的java版-Go语言中文社区,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Apache Pig 用户定义函数(UDF)

除了内置函数之外,Apache Pig还为User Defined Function(UDF:用户定义函数)提供广泛的支持。使用这些UDF,可以定义我们自己的函数并使用它们。UDF支持六种编程语言,即Java,Jython,Python,JavaScript,Ruby和Groovy。

对于编写UDF,在Java中提供全面的支持,并在所有其他语言中提供有限的支持。使用Java,你可以编写涉及处理的所有部分的UDF,如数据加载/存储,列转换和聚合。由于Apache Pig是用Java编写的,因此与其他语言相比,使用Java语言编写的UDF工作效率更高。

在Apache Pig中,我们还有一个用于UDF名为Piggybank的Java存储库。使用Piggybank,我们可以访问由其他用户编写的Java UDF,并贡献我们自己的UDF。

Java中的UDF的类型

在使用Java编写UDF时,我们可以创建和使用以下三种类型的函数

Filter函数 - Filter(过滤)函数用作过滤器语句中的条件。这些函数接受Pig值作为输入并返回布尔值。

Eval函数 - Eval函数在FOREACH-GENERATE语句中使用。这些函数接受Pig值作为输入并返回Pig结果。

Algebraic函数 - Algebraic(代数)函数对FOREACHGENERATE语句中的内包起作用。这些函数用于对内包执行完全MapReduce操作。

使用Java编写UDF

要使用Java编写UDF,我们必须集成jar文件Pig-0.15.0.jar。在本章节中,将讨论如何使用Eclipse编写示例UDF。在继续学习前,请确保你已在系统中安装了Eclipse和Maven。

按照下面给出的步骤写一个UDF函数:

打开Eclipse并创建一个新项目(例如myproject)。

将新创建的项目转换为Maven项目。

在pom.xml中复制以下内容。此文件包含Apache Pig和Hadoop-core jar文件的Maven依赖关系。

xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0http://maven.apache .org/xsd/maven-4.0.0.xsd">

4.0.0

Pig_Udf

Pig_Udf

0.0.1-SNAPSHOT

src

maven-compiler-plugin

3.3

1.7

1.7

org.apache.pig

pig

0.15.0

org.apache.hadoop

hadoop-core

0.20.2

保存文件并刷新它。在Maven依赖关系部分中,可以找到下载的jar文件。

创建名为Sample_Eval的新的类文件,并在其中复制以下内容。import java.io.IOException;

import org.apache.pig.EvalFunc;

import org.apache.pig.data.Tuple;

import java.io.IOException;

import org.apache.pig.EvalFunc;

import org.apache.pig.data.Tuple;

public class Sample_Eval extends EvalFunc{

public String exec(Tuple input) throws IOException {

if (input == null || input.size() == 0)

return null;

String str = (String)input.get(0);

return str.toUpperCase();

}

}

在编写UDF时,必须继承EvalFunc类并向 exec() 函数提供实现。在此函数中,写入UDF所需的代码。在上面的例子中,我们返回了将给定列的内容转换为大写的代码。

编译完类并确认没有错误后,右键单击Sample_Eval.java文件。它将呈现一个菜单。选择“export”,如以下屏幕截图所示。

注意:打的jar包不需要依赖包

a9c7d4f644ef954d423d452d4949ba02.png

fdbeeee59b6fe3b9f8e3e284356794b7.png

点击“export”,将看到以下窗口。 点击“JAR file”。

92042821b8b4ccf1bbaf0fd1d021f4e9.png

点击“Next>”按钮继续操作。将获得另一个窗口,你需要在本地文件系统中输入路径,在其中存储jar文件。

db92ce7036b3cb3bdf7a71418e1ef88f.png

最后,单击“Finish”按钮。在指定的文件夹中,创建一个Jar文件sample_udf.jar。此jar文件包含用Java编写的UDF。

使用UDF

在编写UDF和生成Jar文件后,请按照下面给出的步骤:

步骤1:注册Jar文件

在写入UDF(在Java中)后,我们必须使用Register运算符注册包含UDF的Jar文件。通过注册Jar文件,用户可以将UDF的位置绑定到Apache Pig。

语法

下面给出了Register运算符的语法。

注意:此处如果path不写hdfs://,默认为本地磁盘路径,如需hdfs上的文件,请使用hdfs://

每次进入pig,都需要重新REGISTER

REGISTER path;

让我们注册本章前面创建的sample_udf.jar。以本地模式启动Apache Pig并注册jar文件sample_udf.jar,如下所示。

$cd PIG_HOME/bin

$./pig –x local

REGISTER '/$PIG_HOME/sample_udf.jar'

注意:假设路径中的Jar文件:/$PIG_HOME/sample_udf.jar

步骤2:定义别名

注册UDF后,可以使用Define运算符为其定义一个别名。

语法

下面给出了Define运算符的语法。

DEFINE alias {function | [`command` [input] [output] [ship] [cache] [stderr] ] };

定义sample_eval的别名,如下所示。

DEFINE sample_eval Sample_Eval();

注意此处 如果类中带包名,如com.test.Sample_Eval; 则需要

DEFINE sample_eval com.test.Sample_Eval();

步骤3:使用UDF

定义别名后,可以使用与内置函数相同的UDF。假设在HDFS /Pig_Data/目录中有一个名为emp_data的文件,其中包含以下内容。

001,Robin,22,newyork

002,BOB,23,Kolkata

003,Maya,23,Tokyo

004,Sara,25,London

005,David,23,Bhuwaneshwar

006,Maggy,22,Chennai

007,Robert,22,newyork

008,Syam,23,Kolkata

009,Mary,25,Tokyo

010,Saran,25,London

011,Stacy,25,Bhuwaneshwar

012,Kelly,22,Chennai

并假设我们已将此文件加载到Pig中,如下所示。

grunt> emp_data = LOAD 'hdfs://localhost:9000/pig_data/emp1.txt' USING PigStorage(',')

as (id:int, name:chararray, age:int, city:chararray);

现在使用UDF sample_eval 将员工的姓名转换为大写。

grunt> Upper_case = FOREACH emp_data GENERATE sample_eval(name);

也可以直接使用带有包名的如:

grunt> Upper_case = FOREACH emp_data GENERATE com.test.sample_eval(name);

请验证关系Upper_case的内容,如下所示。

grunt> Dump Upper_case;

(ROBIN)

(BOB)

(MAYA)

(SARA)

(DAVID)

(MAGGY)

(ROBERT)

(SYAM)

(MARY)

(SARAN)

(STACY)

(KELLY)

这篇关于java udf for pig_pig 教程及 自定义udf 的java版-Go语言中文社区的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/740035

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2