Apache Pig UDF : 1 부 – 평가, 집계 및 필터링 기능



이 게시물은 Apache Pig UDF-평가, 집계 및 필터 기능에 대해 설명합니다. Eval, Aggregate 및 Filter 함수를 살펴보십시오.

Apache Pig는 사용자 정의 처리를 지정하는 방법으로 사용자 정의 함수 (UDF)에 대한 광범위한 지원을 제공합니다. Pig UDF는 현재 세 가지 언어로 실행할 수 있습니다. Java, Python, JavaScript 및 Ruby. Java 기능에 대한 가장 광범위한 지원이 제공됩니다.





Java UDF는 여러 방법을 통해 호출 할 수 있습니다. 가장 간단한 UDF는 exec 함수 만 구현하면되는 EvalFunc를 확장 할 수 있습니다. 모든 Eval UDF는이를 구현해야합니다. 또한 함수가 대수적이면 Algebraic 인터페이스를 구현하여 쿼리 성능을 크게 향상시킬 수 있습니다.

Pig에서 UDF의 중요성 :

Pig를 사용하면 UDF를 통해 기존 연산자를 자신 또는 다른 코드와 결합 할 수 있습니다. Pig의 장점은 사용자가 UDF를 통해 운영자를 자신 또는 다른 사람의 코드와 결합 할 수 있다는 것입니다. 버전 0.7까지 모든 UDF는 Java로 작성되어야하며 Java 클래스로 구현됩니다. 이렇게하면 Java 클래스를 작성하고 Pig에 JAR 파일에 대해 알려줌으로써 Pig에 새 UDF를 더 쉽게 추가 할 수 있습니다.



배열 js의 길이 얻기

Pig 자체에는 UDF가 있습니다. 버전 0.8 이전에는 표준 SQL 집계 함수와 기타 몇 가지 기능 만 포함 된 매우 제한된 세트였습니다. 0.8에서는 많은 표준 문자열 처리, 수학 및 복합 유형 UDF가 추가되었습니다.

Piggybank는 무엇입니까?

Piggybank는 Pig와 함께 출시되는 사용자 제공 UDF 모음입니다. Piggybank UDF는 Pig JAR에 포함되어 있지 않으므로 스크립트에 수동으로 등록해야합니다. 고유 한 UDF를 작성하거나 다른 사용자가 작성한 UDF를 사용할 수도 있습니다.

평가 함수

UDF 클래스는 모든 Eval 함수의 기본이되는 EvalFunc 클래스를 확장합니다. 모든 평가 기능은 Java 클래스 'org.apache.pig.EvalFunc를 확장합니다. '이 경우 Java String 인 UDF의 리턴 유형으로 매개 변수화됩니다. 이 클래스의 핵심 메서드는 'exec'입니다. 코드의 첫 번째 줄은 함수가 myudfs 패키지의 일부임을 나타냅니다.



하나의 레코드를 가져와 실행 파이프 라인을 통과하는 모든 레코드에 대해 호출되는 하나의 결과를 반환합니다. 스크립트가 UDF에 입력으로 전달하는 모든 필드를 포함하는 튜플을 사용합니다. 그런 다음 EvalFunc를 매개 변수화 한 유형을 반환합니다.

double을 int java로 바꾸는 방법

이 함수는 모든 입력 튜플에서 호출됩니다. 함수에 대한 입력은 Pig 스크립트의 함수에 전달되는 순서대로 입력 매개 변수가있는 튜플입니다. 아래 표시된 예에서 함수는 문자열을 입력으로 사용합니다. 다음 함수는 문자열을 소문자에서 대문자로 변환합니다. 이제 함수가 구현되었으므로 컴파일하고 JAR에 포함해야합니다.

package myudfs import java.io.IOException import org.apache.pig.EvalFunc import org.apache.pig.data.Tuple public class UPPER extends EvalFunc {public String exec (Tuple input) throws IOException {if (input == null || input.size () == 0) return null try {String str = (String) input.get (0) return str.toUpperCase ()} catch (Exception e) {throw new IOException ( 'Caught exception processing input row', e)}}}

집계 함수 :

집계 함수는 또 다른 일반적인 유형의 평가 함수입니다. 집계 함수는 일반적으로 그룹화 된 데이터에 적용됩니다. Aggregate 함수는 백을 가져와 스칼라 값을 반환합니다. 많은 Aggregate 함수의 흥미롭고 중요한 기능은 분산 방식으로 점진적으로 계산할 수 있다는 것입니다. Hadoop 세계에서 이것은 부분 계산이 Map과 Combiner에 의해 수행 될 수 있고 최종 결과는 Reducer에 의해 계산 될 수 있음을 의미합니다.

대수적인 집계 함수가 그대로 구현되었는지 확인하는 것이 매우 중요합니다. 이 유형의 예로는 내장 COUNT, MIN, MAX 및 AVERAGE가 있습니다.

카운트 는 데이터 하위 집합의 요소 수를 계산 한 다음 개수를 합산하여 최종 출력을 생성 할 수있는 대수 함수의 예입니다. COUNT 함수의 구현을 살펴 보겠습니다.

메서드 오버로딩과 재정의의 차이점
public class COUNT extends EvalFunc는 Algebraic {public Long exec (Tuple input) throws IOException {return count (input)} public String getInitial () {return Initial.class.getName ()} public String getIntermed () {return Intermed.class. getName ()} public String getFinal () {return Final.class.getName ()} static public class Initial extends EvalFunc {public Tuple exec (Tuple input) throws IOException {return TupleFactory.getInstance (). newTuple (count (input)) }} static public class Intermed extends EvalFunc {public Tuple exec (Tuple input) throws IOException {return TupleFactory.getInstance (). newTuple (sum (input))}} static public class Final extends EvalFunc {public Tuple exec (Tuple input) throws IOException {return sum (input)}} static protected Long count (Tuple input) throws ExecException {Object values ​​= input.get (0) if (values ​​instanceof DataBag) return ((DataBag) values) .size () else if (values instanceof Map) return new Long (((Map) values) .size ())} static protected Long sum (Tuple i nput) throws ExecException, NumberFormatException {DataBag values ​​= (DataBag) input.get (0) long sum = 0 for (Iterator (Tuple) it = values.iterator () it.hasNext ()) {Tuple t = it.next ( ) sum + = (Long) t.get (0)} return sum}}

COUNT는 다음과 같은 Algebraic 인터페이스를 구현합니다.

공용 인터페이스 Algebraic {public String getInitial () public String getIntermed () public String getFinal ()}

함수가 대수적이 되려면 EvalFunc에서 파생 된 세 클래스의 정의로 구성된 Algebraic 인터페이스를 구현해야합니다. 계약은 Initial 클래스의 execfunction이 한 번 호출되고 원래 입력 튜플에 전달된다는 것입니다. 출력은 부분 결과를 포함하는 튜플입니다. Intermed 클래스의 exec 함수는 0 회 이상 호출 될 수 있으며 Initial 클래스 또는 Intermed 클래스의 이전 호출에 의해 생성 된 부분 결과를 포함하는 튜플을 입력으로 받아 다른 부분 결과가있는 튜플을 생성합니다. 마지막으로 Final 클래스의 exec 함수가 호출되어 최종 결과를 스칼라 유형으로 제공합니다.

필터 기능 :

필터 함수는 부울 값을 반환하는 평가 함수입니다. FILTER 연산자 또는 Bincond 식을 포함하여 부울식이 적합한 모든 곳에서 사용할 수 있습니다. Apache Pig는 Boolean을 완전히 지원하지 않으므로 Filter 함수는 결과가 다른 연산자로 출력되는 'Foreach'와 같은 문에 나타날 수 없습니다. 그러나 필터 함수는 필터 문에서 사용할 수 있습니다.

아래 예제는 IsEmpty 함수를 구현합니다.

import java.io.IOException import java.util.Map import org.apache.pig.FilterFunc import org.apache.pig.PigException import org.apache.pig.backend.executionengine.ExecException import org.apache.pig.data.DataBag import org.apache.pig.data.Tuple import org.apache.pig.data.DataType / ** * 가방이나지도가 비어 있는지 확인합니다. * / public class IsEmpty extends FilterFunc {@Override public Boolean exec (Tuple input) throws IOException {try {Object values ​​= input.get (0) if (values ​​instanceof DataBag) return ((DataBag) values) .size () == 0 else if (values ​​instanceof Map) return ((Map) values) .size () == 0 else {int errCode = 2102 String msg = 'Cannot test a'+ DataType.findTypeName (values) + 'for emptiness.' throw new ExecException (msg, errCode, PigException.BUG)}} catch (ExecException ee) {throw ee}}}