2

我正在使用 Hadoop Pig (0.10.0) 处理日志文件,日志行如下所示:

2012-08-01  INFO   (User:irim)   getListedStocksByMarkets completed in 7041 ms

我想获得与由空格分隔的标记的关系,即:

(2012-08-01,INFO,(User:irim),getListedStocksByMarkets,completed,in,7041,ms)

使用语句加载该数据:

records = LOAD 'myapp.log' using PigStorage(' ');

没有做到这一点,因为我的标记可以被几个空格分隔,导致几个空标记。PigStorage 似乎不支持正则表达式分隔符(或者至少我没有成功配置它)。

所以我的问题是:获得这些令牌的最佳方式是什么?

如果我可以从关系中删除空元素,我会很高兴,可以用 Pig 做到这一点吗?

例如从:

(2012-08-01,,,INFO,,,(User:irim),,getListedStocksByMarkets,completed,in,7041,ms)

要得到

(2012-08-01,INFO,(User:irim),getListedStocksByMarkets,completed,in,7041,ms)

我正在尝试另一种方法,TextLoaderTOKENIZE我不确定这是最好的策略。也许用户加载函数是一个更自然的选择......

问候,

乔尔

4

1 回答 1

2

您可以使用带有正则表达式的内置函数 STRSPLIT 将一行分成一个元组。这是您的特定示例的脚本,其中逗号作为分隔符:

inpt = load '~/data/regex.txt' as (line : chararray);
dump inpt;
-- 2012-08-01,,,INFO,,,(User:irim),,getListedStocksByMarkets,completed,in,7041,ms

splt = foreach inpt generate flatten(STRSPLIT(line, ',+'));
dump splt;
-- (2012-08-01,INFO,(User:irim),getListedStocksByMarkets,completed,in,7041,ms)
于 2012-08-13T21:11:42.240 回答