2012-03-23 26 views
1

有關PIG中JSON處理的一個簡短問題。JSON在PIG中Elephant-Bird UDF中的數組字段處理

我嘗試了一些JsonLoader稱爲大象鳥加載和處理,如以下JSON數據:

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

裝載機非常適用於簡單的領域,但它並不適用於任何數組字段工作。我不知道如何使用此UDF或以任何其他方式訪問數組中的元素(上面的「AD」字段)?請指教。

+0

我創建了自己的UDF來專門處理這種情況下(不是通用的方式雖然)的情況下,其他脂肪酶遇到類似的需求。 – kee 2012-03-28 01:55:56

+0

你有沒有試過用點或哈希來做?我記得使用其中的一個從通過Elephant鳥裝載的json數組中獲取哈希中的東西。 – Eli 2012-03-29 20:14:59

回答

0

我認爲該數組部分以大象鳥JsonLoader作爲包返回。

我不知道這是否是正確的方式來做到這一點,但解決辦法可能是扁平AD - 缺點是你現在將有多行對應數組AD中的每個元素。

3

您應該使用-nestedLoad PARAM這樣的:

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

然後你使用下面的代碼:

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:字節組,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;