新聞中心
除了內(nèi)置函數(shù)之外,Apache Pig還為 User Defined Function(UDF:用戶定義函數(shù))提供廣泛的支持。使用這些UDF,可以定義我們自己的函數(shù)并使用它們。UDF支持六種編程語言,即Java,Jython,Python,JavaScript,Ruby和Groovy。

成都創(chuàng)新互聯(lián)公司成都網(wǎng)站建設按需開發(fā)網(wǎng)站,是成都網(wǎng)站營銷推廣公司,為銅雕雕塑提供網(wǎng)站建設服務,有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設計服務:原型圖制作、網(wǎng)站創(chuàng)意設計、前端HTML5制作、后臺程序開發(fā)等。成都網(wǎng)站設計熱線:028-86922220
對于編寫UDF,在Java中提供全面的支持,并在所有其他語言中提供有限的支持。使用Java,你可以編寫涉及處理的所有部分的UDF,如數(shù)據(jù)加載/存儲,列轉(zhuǎn)換和聚合。由于Apache Pig是用Java編寫的,因此與其他語言相比,使用Java語言編寫的UDF工作效率更高。
在Apache Pig中,我們還有一個用于UDF名為 Piggybank 的Java存儲庫。使用Piggybank,我們可以訪問由其他用戶編寫的Java UDF,并貢獻我們自己的UDF。
Java中的UDF的類型
在使用Java編寫UDF時,我們可以創(chuàng)建和使用以下三種類型的函數(shù)
-
Filter函數(shù) - Filter(過濾)函數(shù)用作過濾器語句中的條件。這些函數(shù)接受Pig值作為輸入并返回布爾值。
-
Eval函數(shù) - Eval函數(shù)在FOREACH-GENERATE語句中使用。這些函數(shù)接受Pig值作為輸入并返回Pig結(jié)果。
-
Algebraic函數(shù) - Algebraic(代數(shù))函數(shù)對FOREACHGENERATE語句中的內(nèi)包起作用。這些函數(shù)用于對內(nèi)包執(zhí)行完全MapReduce操作。
使用Java編寫UDF
要使用Java編寫UDF,我們必須集成jar文件 Pig-0.15.0.jar 。在本章節(jié)中,將討論如何使用Eclipse編寫示例UDF。在繼續(xù)學習前,請確保你已在系統(tǒng)中安裝了Eclipse和Maven。
按照下面給出的步驟寫一個UDF函數(shù):
-
打開Eclipse并創(chuàng)建一個新項目(例如 myproject )。
-
將新創(chuàng)建的項目轉(zhuǎn)換為Maven項目。
-
在pom.xml中復制以下內(nèi)容。此文件包含Apache Pig和Hadoop-core jar文件的Maven依賴關系。
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文件。
-
創(chuàng)建名為 Sample_Eval 的新的類文件,并在其中復制以下內(nèi)容。
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() 函數(shù)提供實現(xiàn)。在此函數(shù)中,寫入UDF所需的代碼。在上面的例子中,我們返回了將給定列的內(nèi)容轉(zhuǎn)換為大寫的代碼。
-
編譯完類并確認沒有錯誤后,右鍵單擊Sample_Eval.java文件。它將呈現(xiàn)一個菜單。選擇“export”,如以下屏幕截圖所示。
-
點擊“export”,將看到以下窗口。 點擊“JAR file”。
-
點擊“Next>”按鈕繼續(xù)操作。將獲得另一個窗口,你需要在本地文件系統(tǒng)中輸入路徑,在其中存儲jar文件。
-
最后,單擊“Finish”按鈕。在指定的文件夾中,創(chuàng)建一個Jar文件 sample_udf.jar 。此jar文件包含用Java編寫的UDF。
使用UDF
在編寫UDF和生成Jar文件后,請按照下面給出的步驟:
步驟1:注冊Jar文件
在寫入UDF(在Java中)后,我們必須使用Register運算符注冊包含UDF的Jar文件。通過注冊Jar文件,用戶可以將UDF的位置綁定到Apache Pig。
語法
下面給出了Register運算符的語法。
REGISTER path;
例
讓我們注冊本章前面創(chuàng)建的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();
步驟3:使用UDF
定義別名后,可以使用與內(nèi)置函數(shù)相同的UDF。假設在HDFS /Pig_Data/ 目錄中有一個名為emp_data的文件,其中包含以下內(nèi)容。
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);
現(xiàn)在使用UDF sample_eval 將員工的姓名轉(zhuǎn)換為大寫。
grunt> Upper_case = FOREACH emp_data GENERATE sample_eval(name);
請驗證關系 Upper_case 的內(nèi)容,如下所示。
grunt> Dump Upper_case; (ROBIN) (BOB) (MAYA) (SARA) (DAVID) (MAGGY) (ROBERT) (SYAM) (MARY) (SARAN) (STACY) (KELLY)
文章名稱:創(chuàng)新互聯(lián)ApachePig教程:ApachePig用戶定義函數(shù)(UDF)
標題URL:http://www.dlmjj.cn/article/codgchh.html


咨詢
建站咨詢
