복붙노트

[HADOOP] Pig Latin에서 그룹당 하나의 파일 작성

HADOOP

Pig Latin에서 그룹당 하나의 파일 작성

문제 : Apache 웹 서버 로그 항목이 포함 된 수많은 파일이 있습니다. 이러한 항목은 날짜 시간 순서가 아니며 파일 전체에 흩어져 있습니다. Pig를 사용하여 하루 분량의 파일을 읽고 날짜 시간별로 로그 항목을 그룹화하고 정렬 한 다음 포함 된 항목의 요일과 시간으로 명명 된 파일에 씁니다.

설정: 파일을 가져 오면 Regex를 사용하여 날짜 필드를 얻은 다음 시간으로 자릅니다. 이렇게하면 한 필드에 레코드가 있고 다른 필드에서는 날짜가 시간으로 잘린 세트가 생성됩니다. 여기에서 날짜 시간 필드를 기준으로 그룹화하고 있습니다.

첫번째 시도: 내 첫 번째 생각은 FOREACH를 사용하여 내 그룹을 반복하면서 STORE 명령을 사용하고 Pig로 멋지지 않은 것을 빨리 발견했습니다.

두 번째 시도 : 두 번째 시도는 파일을 볼 때까지 훌륭하게 작동하는 piggybank에서 MultiStorage () 메소드를 사용하는 것입니다. 문제는 MulitStorage가 그룹화하는 데 사용 된 필드를 포함하여 모든 필드를 파일에 쓰려고한다는 것입니다. 내가 정말로 원하는 것은 파일에 기록 된 원본 레코드입니다.

질문: 그래서 ... 돼지가 아닌 것을 위해 Pig를 사용하고 있습니까? 아니면 Pig를 사용 하여이 문제에 접근하는 더 좋은 방법이 있습니까? 이제이 질문이 있으므로 간단한 코드 예제를 작성하여 문제를 더 자세히 설명하겠습니다. 가지고 있으면 여기에 게시하겠습니다. 미리 감사드립니다.

해결법

  1. ==============================

    1.기본적으로 Pig에는 많은 기능이 없습니다. 기본 작업을 수행하지만 사용자 지정 UDF를 작성하거나 기능을로드 / 저장하여 펑크 션을 작성하여 95 %의 방법으로 100 %의 방법을 얻는 것이 아닙니다. 작은 상점 함수를 작성하는 것이 전체 MapReduce 프로그램보다 Java보다 훨씬 적기 때문에 일반적으로 가치가 있습니다.

    기본적으로 Pig에는 많은 기능이 없습니다. 기본 작업을 수행하지만 사용자 지정 UDF를 작성하거나 기능을로드 / 저장하여 펑크 션을 작성하여 95 %의 방법으로 100 %의 방법을 얻는 것이 아닙니다. 작은 상점 함수를 작성하는 것이 전체 MapReduce 프로그램보다 Java보다 훨씬 적기 때문에 일반적으로 가치가 있습니다.

    두 번째 시도는 내가하고자하는 것과 매우 가깝습니다. MultiStorage의 소스 코드를 복사 / 붙여 넣기하거나 상속을 시작점으로 사용해야합니다. 그런 다음 putNext 메소드를 수정하여 그룹 값을 제거하되 여전히 해당 파일에 쓰십시오. 불행히도 Tuple에는 제거 또는 삭제 방법이 없으므로 전체 튜플을 다시 작성해야합니다. 또는 모든 것이 원래 문자열 인 경우 터플에 싸인 출력을 꺼내십시오.

    좀 더 도움이 필요한 경우로드 / 저장 함수 작성에 대한 일부 일반적인 문서 : http://pig.apache.org/docs/r0.10.0/udf.html#load-store-functions

  2. from https://stackoverflow.com/questions/10388510/writing-one-file-per-group-in-pig-latin by cc-by-sa and MIT license