복붙노트

[HADOOP] 돼지에 Raw JSON로드하기

HADOOP

돼지에 Raw JSON로드하기

나는 각 줄이 JSON 객체 인 파일을 가지고있다. (실제로는 stackoverflow의 덤프이다.) 가능한 한 쉽게 Apache Pig에로드하고 싶지만 Pig에게 입력 형식이 무엇인지 알려면 알아 내는데 어려움이 있습니다. 다음은 항목의 예입니다.

{ 
"_id" : { "$oid" : "506492073401d91fa7fdffbe" }, 
"Body" : "....", 
"ViewCount" : 7351, 
"LastEditorDisplayName" : "Rich B", 
"Title" : ".....", 
"LastEditorUserId" : 140328, 
"LastActivityDate" : { "$date" : 1314819738077 }, 
"LastEditDate" : { "$date" : 1313882544213 }, 
"AnswerCount" : 12, "CommentCount" : 19, 
"AcceptedAnswerId" : 7, 
"Score" : 83, 
"PostTypeId" : "question", 
"OwnerUserId" : 8, 
"Tags" : [ "c#", "winforms" ], 
"CreationDate" : { "$date" : 1217540572667 }, 
"FavoriteCount" : 13, "Id" : 4, 
"ForumName" : "stackoverflow.com" 
}

스키마를 직접 지정하지 않고도 각 행이 위의 중 하나 인 파일을로드 할 수있는 방법이 있습니까? 아니면 모든 객체에서 관측 된 (가능하게는 중첩 된) 키를 기반으로 스키마를 자동으로 생성하는 방법일까요? 스키마를 직접 지정해야하는 경우 스키마 문자열은 어떤 모양입니까?

감사!

해결법

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

    1.빠르고 쉬운 방법 : Twitter의 elephantbird 프로젝트를 사용하십시오. 내부에는 com.twitter.elephantbird.pig.load.JsonLoader라는 로더가 있습니다. 이렇게 직접 사용될 때,

    빠르고 쉬운 방법 : Twitter의 elephantbird 프로젝트를 사용하십시오. 내부에는 com.twitter.elephantbird.pig.load.JsonLoader라는 로더가 있습니다. 이렇게 직접 사용될 때,

    A = LOAD '/path/to/data.json' USING com.twitter.elephantbird.pig.load.JsonLoader() as (json:map[]);
    B = FOREACH A GENERATE json#'fieldName' AS field_name;
    

    중첩 된 요소는로드되지 않습니다. 그러나, (원하는 경우)이를 다음과 같이 변경하여 쉽게 수정할 수 있습니다.

    A = LOAD '/path/to/data.json' USING com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad')
    

    elephantbird를 포함하는 것은 쉽습니다. Maven (또는 동급의) 종속성 관리자를 사용하여 조직 "com.twitter.elephantbird"로 프로젝트 "elephant-bird"를 당긴 다음 돼지에서 일반적인 등록 명령을 발행합니다

    register 'lib/elephantbird.jar';
    
  2. from https://stackoverflow.com/questions/12644392/loading-raw-json-into-pig by cc-by-sa and MIT license