Apache Pig-사용자 정의 함수

내장 기능 외에도 Apache Pig는 다음에 대한 광범위한 지원을 제공합니다. User D정교한 Functions (UDF). 이러한 UDF를 사용하여 자체 함수를 정의하고 사용할 수 있습니다. UDF 지원은 Java, Jython, Python, JavaScript, Ruby 및 Groovy의 6 가지 프로그래밍 언어로 제공됩니다.

UDF 작성을 위해 완전한 지원이 Java로 제공되고 나머지 모든 언어로 제한된 지원이 제공됩니다. Java를 사용하면 데이터로드 / 저장, 열 변환 및 집계와 같은 처리의 모든 부분을 포함하는 UDF를 작성할 수 있습니다. Apache Pig는 Java로 작성되었으므로 Java 언어를 사용하여 작성된 UDF는 다른 언어에 비해 효율적으로 작동합니다.

Apache Pig에는 UDF에 대한 Java 저장소도 있습니다. Piggybank. Piggybank를 사용하면 다른 사용자가 작성한 Java UDF에 액세스하고 자체 UDF를 제공 할 수 있습니다.

자바의 UDF 유형

Java를 사용하여 UDF를 작성하는 동안 다음 세 가지 유형의 함수를 만들고 사용할 수 있습니다.

  • Filter Functions− 필터 기능은 필터 문에서 조건으로 사용됩니다. 이러한 함수는 Pig 값을 입력으로 받아들이고 부울 값을 반환합니다.

  • Eval Functions− Eval 함수는 FOREACH-GENERATE 문에서 사용됩니다. 이 함수는 Pig 값을 입력으로 받아들이고 Pig 결과를 반환합니다.

  • Algebraic Functions− 대수 함수는 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 file.

  • 클릭하여 더 진행하십시오. Next>단추. jar 파일을 저장해야하는 로컬 파일 시스템의 경로를 입력해야하는 또 다른 창이 나타납니다.

  • 마지막으로 Finish단추. 지정된 폴더에서 Jar 파일sample_udf.jar생성됩니다. 이 jar 파일에는 Java로 작성된 UDF가 포함되어 있습니다.

UDF 사용

UDF를 작성하고 Jar 파일을 생성 한 후 아래 단계를 따르십시오.

1 단계 : Jar 파일 등록

UDF (Java로)를 작성한 후 Register 연산자를 사용하여 UDF가 포함 된 Jar 파일을 등록해야합니다. Jar 파일을 등록하면 사용자는 UDF의 위치를 ​​Apache Pig에 알릴 수 있습니다.

Syntax

다음은 Register 연산자의 구문입니다.

REGISTER path;

Example

예를 들어이 장의 앞부분에서 만든 sample_udf.jar를 등록 해 보겠습니다.

로컬 모드에서 Apache Pig를 시작하고 아래와 같이 jar 파일 sample_udf.jar을 등록합니다.

$cd PIG_HOME/bin 
$./pig –x local 

REGISTER '/$PIG_HOME/sample_udf.jar'

Note − 경로에 Jar 파일이 있다고 가정 − /$PIG_HOME/sample_udf.jar

2 단계 : 별칭 정의

UDF를 등록한 후 다음을 사용하여 별칭을 정의 할 수 있습니다. Define 운영자.

Syntax

다음은 Define 연산자의 구문입니다.

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

Example

아래와 같이 sample_eval의 별칭을 정의합니다.

DEFINE sample_eval sample_eval();

3 단계 : UDF 사용

별칭을 정의한 후 내장 함수와 동일한 UDF를 사용할 수 있습니다. HDFS에 emp_data라는 파일이 있다고 가정합니다./Pig_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)