如何使用Pig从列中解析JSON字符串

时间:2014-05-22 16:18:42

标签: logging hadoop apache-pig bigdata

我有tsv日志文件,其中列由json字符串填充。

我想在 Pig 脚本中使用 JsonLoader 解析该列。 我看到很多例子,其中 JsonLoader 用于每行只是一个json字符串的情况。我还有其他要删除的专栏,我不知道该怎么做。

该文件如下所示:

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

我该怎么做?

2 个答案:

答案 0 :(得分:4)

您正在寻找Elephant Bird中提供的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}

Pig Script:

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 / string):

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

后处理(JSON as map):


-------------------------------------------------------------------------------------------------
| 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?

答案 1 :(得分:0)

查看Elephantbird(Twitter的所有Hadoop库) - 他们有一个名为JsonStringToMap的UDF,它可以完全满足您的需求(获取字符串并将其转换为地图)。