我正在使用 Hadoop Pig (0.10.0) 来处理日志文件,日志行如下所示:
2012-08-01 INFO (User:irim) getListedStocksByMarkets completed in 7041 ms
我想获得与由空格分隔的标记的关系,即:
(2012-08-01,INFO,(用户:irim),getListedStocksByMarkets,完成,in,7041,ms
)
使用语句加载该数据:
records = 使用 PigStorage(' ') 加载 'myapp.log';
没有实现这一点,因为我的 token 可能被几个空格分隔,导致几个空 token 。 PigStorage 似乎不支持正则表达式分隔符(或者至少我没有成功地以这种方式配置它)。
所以我的问题是:获得这些代币的最佳方式是什么?
如果我可以从关系中删除空元素,我会很高兴,可以用 Pig 做到这一点吗?
例如从以下位置开始:
(2012-08-01,,,INFO,,,(用户:irim),,getListedStocksByMarkets,完成,in,7041,ms
)
获取
(2012-08-01,INFO,(用户:irim),getListedStocksByMarkets,完成,in,7041,ms
)
我正在尝试使用 TextLoader
和 TOKENIZE
的另一种方法,但我不确定这是最好的策略。
也许用户加载函数是一个更自然的选择......
问候,
乔尔
最佳答案
您可以使用内置函数 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)
关于apache-pig - pig : parsing line with blank delimiter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11936826/