Apache-pig-user-defined-functions
Apache Pig-ユーザー定義関数
組み込み関数に加えて、Apache Pigは* U ser D efined F * unctions(UDF)の広範なサポートを提供します。 これらのUDFを使用して、独自の関数を定義して使用できます。 UDFサポートは、Java、Jython、Python、JavaScript、Ruby、Groovyの6つのプログラミング言語で提供されます。
UDFを記述するために、Javaで完全なサポートが提供され、残りのすべての言語で限定的なサポートが提供されます。 Javaを使用すると、データのロード/ストア、列変換、集計などの処理のすべての部分を含むUDFを作成できます。 Apache PigはJavaで記述されているため、Java言語を使用して記述されたUDFは他の言語と比較して効率的に機能します。
Apache Pigには、 Piggybank という名前のUDFのJavaリポジトリもあります。 Piggybankを使用すると、他のユーザーが作成したJava UDFにアクセスし、独自のUDFを提供できます。
JavaのUDFの種類
Javaを使用してUDFを記述している間、次の3種類の関数を作成して使用できます-
- フィルター関数-フィルター関数はフィルターステートメントの条件として使用されます。 これらの関数は、入力としてPig値を受け入れ、ブール値を返します。
- 評価関数-評価関数はFOREACH-GENERATE文で使用されます。 これらの関数は、入力として豚の値を受け入れ、豚の結果を返します。
- 代数関数-代数関数は、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依存関係が含まれています。
<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.0http://maven.apache .org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Pig_Udf</groupId>
<artifactId>Pig_Udf</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.pig</groupId>
<artifactId>pig</artifactId>
<version>0.15.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>0.20.2</version>
</dependency>
</dependencies>
</project>
*ファイルを保存して更新します。* Maven Dependencies *セクションで、ダウンロードした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<String>{
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 を選択します。
- export をクリックすると、次のウィンドウが表示されます。 * JARファイル*をクリックします。
- Next> ボタンをクリックして、さらに進みます。 ローカルファイルシステムのパスを入力する必要がある別のウィンドウが表示されます。ここで、jarファイルを保存する必要があります。
- 最後に、 Finish ボタンをクリックします。 指定されたフォルダーに、Jarファイル sample_udf.jar が作成されます。 このjarファイルには、Javaで記述されたUDFが含まれています。
UDFを使用する
UDFを書いてJarファイルを生成した後、以下の手順に従ってください-
ステップ1:Jarファイルの登録
(Javaで)UDFを作成した後、Register演算子を使用してUDFを含むJarファイルを登録する必要があります。 Jarファイルを登録することにより、ユーザーはUDFの場所をApache 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 演算子を使用してUDFにエイリアスを定義できます。
構文
以下に定義演算子の構文を示します。
DEFINE alias {function | [`command` [input] [output] [ship] [cache] [stderr] ] };
- 例 *
以下に示すように、sample_evalのエイリアスを定義します。
DEFINE sample_eval 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);
以下に示すように、リレーション Upper_case の内容を確認します。
grunt> Dump Upper_case;
(ROBIN)
(BOB)
(MAYA)
(SARA)
(DAVID)
(MAGGY)
(ROBERT)
(SYAM)
(MARY)
(SARAN)
(STACY)
(KELLY)