2014-05-22 20 views
4

我有tsv日誌文件,其中的列由json字符串填充。如何使用Pig解析列中的JSON字符串

我想解析該列JsonLoaderPig腳本。 我看到很多例子,其中JsonLoader用於每行只有一個json字符串的情況。我有其他專欄,我想跳過,我不知道該怎麼做。

文件看起來是這樣的:

foo bar {"version":1; "type":"an event"; "count": 1} 
foo bar {"version":1; "type":"another event"; "count": 1} 

我怎麼能這樣做?

回答

0

查看Elephantbird(推特的所有事情Hadoop庫) - 他們有一個名爲JsonStringToMap的UDF,它完全符合您的需求(接受一個字符串並將其轉換爲地圖)。

+0

本來不想使用ElephantBird了點。有沒有其他方法?我試圖重新編譯EB,但卡住了某處。看起來這不容易建立。 #noob –

+1

爲什麼不呢?你不必編譯ElephantBird。你可以在http://search.maven.org/#artifactdetails%7Ccom.twitter.elephantbird%7Celephant-bird-pig%7C4.5%7Cjar查找罐子 – SNeumann

4

您正在尋找象鳥提供的JsonStringToMap UDF:https://github.com/kevinweil/elephant-bird/search?q=JsonStringToMap&ref=cmdform

示例文件:

foo  bar  {"version":1, "type":"an event", "count": 1} 
foo  bar  {"version":1, "type":"another event", "count": 1} 

豬腳本:

REGISTER /path/to/elephant-bird.jar; 
DEFINE JsonStringToMap com.twitter.elephantbird.pig.piggybank.JsonStringToMap(); 
raw = LOAD '/tmp/file.tsv' USING PigStorage('\t') AS (col1:chararray,col2:chararray,json_string:chararray); 
parsed = FOREACH raw GENERATE col1,col2,JsonStringToMap(json_string); 
ILLUSTRATE parsed; -- Just to show the output 

預處理(JSON作爲chararray /串):

------------------------------------------------------------------------------------------------------- 
| raw  | col1:chararray | col2:chararray | json_string:chararray        | 
------------------------------------------------------------------------------------------------------- 
|   | foo    | bar    | {"version":1, "type":"another event", "count": 1} | 

後處理(JSON作爲地圖):


------------------------------------------------------------------------------------------------- 
| parsed  | col1:chararray | col2:chararray | json:map(:chararray)      | 
------------------------------------------------------------------------------------------------- 
|   | foo    | bar    | {count=1, type=another event, version=1} | 
------------------------------------------------------------------------------------------------- 

這是同樣的問題問就在兩天前:How do you decode JSON in Pig that comes from a column?