我正在使用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 似乎不支持正则表达式分隔符(或者至少我没有以这种方式成功配置它)。
所以我的问题:获得这些代币的最佳方式是什么?
如果我能从关系中删除空元素,我会很高兴,有可能用猪做到这一点吗?
例如从 :
(2012-08-01,,,INFO,,,(User:irim),,getListedStocksByMarkets,completed,in,7041,ms
)
要得到
(2012-08-01,INFO,(User:irim),getListedStocksByMarkets,completed,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)