Apache Pig UDF : 2 부 –로드 기능



이 게시물은 Apache Pig UDF-로드 기능에 대해 설명합니다. (Apache Pig UDF : 파트 2). Apache Pig UDF의로드 기능을 살펴보십시오.

오늘의 게시물은 Apache Pig의로드 기능에 대한 것입니다. 이것은 속편입니다 첫 번째 게시물 Eval, Filter 및 Aggregate와 같은 UDF 기능을 다루었습니다. Pig UDF의 다른 기능에 대한 자세한 내용은 참조하십시오.





hadoop 관리자 역할 및 책임

Pig의로드 기능은 Hadoop이 데이터를 읽는 데 사용하는 클래스 인 Hadoop의 InputFormat 위에 구축됩니다. InputFormat에는 두 가지 목적이 있습니다. 맵 작업간에 입력이 분할되는 방식을 결정하고 해당 맵 작업에 대한 입력으로 키-값 쌍을 생성하는 RecordReader를 제공합니다. 로드 함수의 기본 클래스는 LoadFunc입니다.

부하 기능 – 분류 :

LoadFunc 추상 클래스에는 데이터를로드하는 세 가지 주요 메서드가 있으며 대부분의 사용 사례에서 확장하는 것으로 충분합니다. 확장 된 기능을 구현하기 위해 구현할 수있는 세 가지 다른 선택적 인터페이스가 있습니다.



  • LoadMetadata :

LoadMetadata에는 메타 데이터를 처리하는 메서드가 있습니다. 대부분의 로더 실행은 메타 데이터 시스템과 상호 작용하지 않는 한이를 구현할 필요가 없습니다. 이 인터페이스의 getSchema () 메서드는 로더 구현이 데이터 스키마에 대해 Pig에 다시 통신하는 방법을 제공합니다. 로더 구현이 실제 유형의 필드로 구성된 데이터를 반환하는 경우 getSchema () 메서드를 통해 반환 된 데이터를 설명하는 스키마를 제공해야합니다. 다른 방법은 파티션 키 및 통계와 같은 다른 유형의 메타 데이터를 처리합니다. 구현은 다른 구현에 유효하지 않은 경우 이러한 메서드에 대해 null 반환 값을 반환 할 수 있습니다.

  • LoadPushDown :

LoadPushDown에는 Pig 런타임에서 로더 구현으로 작업을 푸시하는 다양한 방법이 있습니다. 현재, Pig 스크립트에 필요한 정확한 필드 인 로더와 통신하기 위해 Pig는 pushProjection () 메서드 만 호출합니다. 로더 구현은 요청을 준수할지 여부를 선택할 수 있습니다. 로더 구현이 요청을 준수하기로 결정한 경우 쿼리 성능을 향상시키기 위해 LoadPushDown을 구현해야합니다.

  • pushProjection () :

이 메서드는 Pig 스크립트에 필요한 필드를 LoadFunc에 알립니다. 따라서 LoadFunc를 사용하면 필요한 필드 만로드하여 성능을 향상시킬 수 있습니다. pushProjection ()은 'requiredFieldList'를 사용합니다. 'requiredFieldList'는 읽기 전용이며 LoadFunc에서 변경할 수 없습니다. ‘requiredFieldList’에는‘requiredField’목록이 포함되어 있습니다. 여기서 각‘requiredField’는 Pig 스크립트에 필요한 필드를 나타내며 색인, 별칭, 유형 및 하위 필드로 구성됩니다. Pig는 열 인덱스 requiredField.index를 사용하여 Pig 스크립트에 필요한 필드에 대해 LoadFunc와 통신합니다. 필수 필드가 맵이면 Pig는 맵의 Pig 스크립트에 필요한 키 목록이 포함 된 'requiredField.subFields'를 전달합니다.



  • LoadCaster :

LoadCaster에는 바이트 배열을 특정 유형으로 변환하는 기술이 있습니다. 로더 구현은 DataByteArray 필드에서 다른 유형으로의 암시 적 또는 명시 적 캐스트가 지원되어야하는 경우이를 구현해야합니다.

LoadFunc 추상 클래스는 로더 구현을 위해 확장 할 기본 클래스입니다. 재정의해야하는 메서드는 다음과 같습니다.

  • getInputFormat () :

    이 메서드는 Pig가 로더에서 사용하는 InputFormat을 가져 오기 위해 호출합니다. InputFormat의 메소드는 MapReduce Java 프로그램의 Hadoop과 동일한 방식으로 Pig에서 호출됩니다. InputFormat이 Hadoop 패키지 인 경우 구현은 org.apache.hadoop.mapreduce에서 새로운 API 기반을 사용해야합니다. 사용자 정의 InputFormat 인 경우 org.apache.hadoop.mapreduce의 새 API를 사용하여 구현하는 것이 좋습니다.

  • setLocation () :

    이 메서드는 Pig가로드 위치를 로더에 전달하기 위해 호출합니다. 로더는이 메소드를 사용하여 동일한 정보를 핵심 InputFormat에 전달해야합니다. 이 메서드는 돼지에 의해 여러 번 호출됩니다.

  • prepareToRead () :

    이 메서드에서는 LoadFunc에서 제공하는 InputFormat과 관련된 RecordReader가 LoadFunc에 전달됩니다. RecordReader는 이제 getNext ()의 구현에서 데이터 레코드를 나타내는 튜플을 Pig로 다시 반환하는 데 사용할 수 있습니다.

  • getNext () :

    getNext ()의 의미는 변경되지 않았으며 Pig 런타임에서 데이터의 다음 튜플을 획득하기 위해 호출됩니다. 이 메서드에서 구현은 기본 RecordReader를 사용하고 반환 할 튜플을 구성해야합니다.

LoadFunc의 기본 구현 :

LoadFunc의 기본 구현은 필요할 때만 재정의해야합니다.

빅 데이터 분석의 응용
  • setUdfContextSignature () :

    이 메서드는 Pig가 프런트 엔드와 백 엔드 모두에서 호출하여 고유 서명을 로더에 전달합니다. 서명은 로더가 프런트 엔드와 백 엔드의 다양한 메서드 호출 사이에 저장해야하는 UDFContext에 모든 정보를 저장하는 데 사용할 수 있습니다. 사용 사례는 getNext ()에서 튜플을 반환하기 전에 백엔드에서 사용하기 위해 LoadPushDown.pushProjection (RequiredFieldList)에 전달 된 RequiredFieldList를 저장하는 것입니다. LoadFunc의 기본 구현에는 빈 본문이 있습니다. 이 메서드는 다른 메서드보다 먼저 호출됩니다.

  • relativeToAbsolutePath () :

    Pig 런타임은이 메서드를 호출하여 로더가 상대로드 위치를 절대 위치로 변환 할 수 있도록합니다. LoadFunc에서 제공하는 기본 구현은 FileSystem 위치에 대해이를 처리합니다. 로드 소스가 다른 경우 로더 구현이이를 재정의하도록 선택할 수 있습니다.

예제의 로더 구현은 줄 구분 기호가‘
Pig의 현재 PigStorage 로더와 유사한 기본 필드 구분 기호로‘및‘‘ 이 구현에서는 기존의 Hadoop 지원 Inputformat – TextInputFormat –을 기본 InputFormat으로 사용합니다.

public class SimpleTextLoader extends LoadFunc {protected RecordReader in = null private byte fieldDel = ''private ArrayList mProtoTuple = null private TupleFactory mTupleFactory = TupleFactory.getInstance () private static final int BUFFER_SIZE = 1024 public SimpleTextLoader () {} / ** * 다음을 생성합니다. 지정된 문자를 필드 구분 기호로 사용하는 돼지 로더입니다. * * @param 구분 기호 * 필드를 구분하는 데 사용되는 1 바이트 문자. * ( ''가 기본값입니다.) * / public SimpleTextLoader (String delimiter) {this () if (delimiter.length () == 1) {this.fieldDel = (byte) delimiter.charAt (0)} else if ( delimiter.length ()> 1 & & delimiter.charAt (0) == '') {switch (delimiter.charAt (1)) {case 't': this.fieldDel = (byte) ''break case 'x' : fieldDel = Integer.valueOf (delimiter.substring (2), 16) .byteValue () break case 'u': this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () break default : throw new RuntimeException ( 'Unknown delimiter'+ delimiter)}} else {throw new RuntimeException ( 'PigStorage delimeter must be a single character')}} @Override public Tuple getNext () throws IOException {try {boolean notDone = in.nextKeyValue () if (notDone) {return null} 텍스트 값 = (텍스트) in.getCurrentValue () byte [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 for (int i = 0 i질문이 있으십니까? 의견란에 언급 해 주시면 연락 드리겠습니다. 

관련 게시물: