2012-03-23 1 views
1

PIG의 JSON 처리에 대한 빠른 질문.Elephant-Bird의 JSON Array 필드 처리 PIG의 UDF

{ 
    "SV":1, 
    "AD":[ 
     { 
     "ID":"46931606", 
     "C1":"46", 
     "C2":"469", 
     "ST":"46931", 
     "PO":1 
     }, 
     { 
     "ID":"46721489", 
     "C1":"46", 
     "C2":"467", 
     "ST":"46721", 
     "PO":5 
     } 
    ] 
} 

로더는 단순한 필드를 잘 작동하지만 어떤 배열 필드 잘 작동하지 않습니다

는 좀 JsonLoader로드하고 다음과 같이 JSON 데이터를 처리하기 위해 코끼리 새라고했습니다. 이 UDF 또는 다른 방법으로 배열의 요소 (위의 "AD"필드)에 어떻게 액세스 할 수 있는지 모르겠습니다. 제발 조언.

+0

다른 ppl이 비슷한 필요성에 부딪히는 경우를 대비하여이 케이스를 구체적으로 (일반적인 방식이 아닌) 처리하도록 내 자신의 UDF를 만들었습니다. – kee

+0

점이나 해시로 해봤습니까? 코끼리 새를 통해로드 된 json 배열에서 해시로 물건에 액세스하기 위해 그 중 하나를 사용했던 것을 기억합니다. – Eli

답변

0

배열 부분이 코끼리 새 JsonLoader와 함께 가방으로 반환된다고 생각합니다.

올바른 방법인지는 모르지만 AD를 단 축할 수 있습니다. 단점은 배열 AD의 각 요소에 해당하는 행이 여러 개 있다는 것입니다.

a = load 'input' using com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad') AS (json:map[]). 

을 그리고 당신은 다음 코드를 사용합니다 :

3

이 같은 -nestedLoad의 PARAM를 사용한다

b = FOREACH a GENERATE (json#'AD') as AD:bag{t:Tuple(m:map[])}; 

이 그런 다음 JSON 배열이 가방 데이터 형식이 될합니다. 터플을 얻기 위해 그것을 평평하게 할 수 있습니다.

이 때
c = FOREACH b GENERATE FLATTEN(AD); 
d = FOREACH c GENERATE AD::m#ID AS ID, AD::m#C1 AS C1, AD::m#C2 AS C2, AD::m#ST AS ST, AD::m#PO AS PO 

, 당신은 스키마가 튜플 데이터 유형 얻을 것이다 (을 ID :이 ByteArray, C) 다른 사람으로

0

로딩 배열하는 동안, 댓글을 달았은 평평해야 할 가방이된다 .

REGISTER elephant-bird-core-4.3.jar; 
REGISTER elephant-bird-hadoop-compat-4.5.jar; 
REGISTER elephant-bird-pig-4.5.jar; 

DEFINE JsonLoader com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad=true'); 

records = LOAD '$DATA_PATH' USING JsonLoader() AS (data: map[]); 
records = FOREACH records GENERATE 
           data#'SV' AS SV, 
           FLATTEN(data#'AD') AS AD; 
records = FOREACH records GENERATE 
           SV, 
           AD#'ID' AS ID, 
           AD#'C1' AS C1, 
           AD#'C2' AS C2, 
           AD#'ST' AS ST, 
           AD#'PO' AS PO;