2011-02-16 19 views
19

我有很多gzip'd日誌文件在s3中有3種類型的日誌行:b,c,i。我和c都是單級json:如何解析Pig中的JSON?

{"this":"that","test":"4"} 

b類型是深深嵌套的json。我碰到這個gist談論編譯一個罐子,使這項工作。由於我的Java技能不如恆星,我不知道從這裏做什麼。

{"this":{"foo":"bar","baz":{"test":"me"},"total":"5"}} 

由於I型和C並不總是以相同的順序,這使得指定一切都在生成正則表達式困難。是否可以使用Pig處理JSON(在gzip文件中)?我使用任何版本的Pig都是基於Amazon Elastic Map Reduce實例構建的。

這可歸結爲兩個問題: 1)我可以用Pig解析JSON嗎?如果是,如何? 2)如果我可以解析JSON(從gzip'd日誌文件),我可以解析嵌套的JSON對象嗎?

回答

5

豬自帶JSON加載程序。 要加載使用:

A = LOAD「data.json」
USING PigJsonLoader();

要存儲,您可以使用:

STORE INTO ‘output.json’ 
    USING PigJsonLoader(); 

但是,我不知道它支持GZIPed數據....

+3

其中/是什麼版本? 0.8.0似乎並不知道它默認情況下。 – ayman 2011-03-01 01:47:37

+1

PigJsonLoader似乎是一個單獨的包? https://開頭github上。com/mmay/PigJsonLoader – 2012-01-04 18:45:55

2

我們可以通過使用JsonLoader做到這一點......但是,我們不得不提到的模式爲您的JSON數據,否則它可能會出現一個error..just按照下面的鏈接

  http://joshualande.com/read-write-json-apache-pig/ 

我們也可以通過創建UDF來解析它...

0

您可以嘗試使用twitter elephantbird json loader,它動態處理json數據。但是您必須對模式非常精確。

api_data = LOAD'文件名'USING com.twitter.elephantbird.pig.load.JsonLoader(' - nestedLoad');

0

我已經看到twitter elephantbird的使用增加了很多,它很快成爲json在PIG中解析的goto庫。

例子:

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

JsonInput = LOAD 'input_path' USING TwitterJsonLoader() AS (entity: map[]); 

InputObjects = FOREACH JsonInput GENERATE (map[]) entity#'Object' AS JsonObject; 

InputIds = FOREACH InputObjects GENERATE JsonObject#'id' AS id;