我有一堆看起来像这样的系统日志数据......
Mon Jan 1 00:00:01 UTC 1970 ServerName debug crond [123456]:系统消息告诉我一些事情
我不确定它在格式化中是否可见,但ServerName的每一侧都有一个制表符分割字符串。所以最初加载它很容易......
A = LOAD '/syslogfiles' USING PigStorage('\t') AS (
date:chararray,
host:chararray,
message:chararray);
所以现在我有一个包含3个字段的元组。这是我遇到麻烦的下一部分。这是伪代码,因为我似乎无法做到正确。我觉得EXTRACT可能就是我想要的东西,但结果并不合适。
我想要做的是进一步分割这些字段,就像
一样B = FOREACH A <split> date USING PigStorage(' ') AS (
day:chararray,
month:chararray,
numday:int,
time:chararray,
timezone:chararray,
year:int);
所以现在我会有一个包含8个字段的元组,(日,月,数字日,时间,时区,年份,主持人,消息)
我假设如果我想使用相同的技术来回答这个问题,我可以继续分配时间:如果我想,或者带有一些价值的信息。
答案 0 :(得分:2)
您正在寻找STRSPLIT
内置UDF。这会返回一个元组。它基本上是Java String.split()
的包装器。如果您提供limit
参数,您的元组将具有可预测的长度,然后您可以使用FLATTEN
将字段提升到最高级别:
B =
FOREACH A
GENERATE
FLATTEN(STRSPLIT(date, ' ', 6)) AS (
day:chararray,
month:chararray,
numday:int,
time:chararray,
timezone:chararray,
year:int),
host,
message;
DESCRIBE B;
B: {day: chararray,month: chararray,numday: int,time: chararray,timezone: chararray,year: int,host: chararray,message: chararray}
答案 1 :(得分:0)
对于像这样的任务想到的第一个方法是REGEX_EXTRACT()尝试这样的事情:
像上面这样的东西很可能会起作用,虽然我的正则表达式可能会变得更简单,如果我考虑更长时间。A = LOAD'/ syslogfiles'使用PigStorage('\ t')AS(日期:chararray, 主持人:chararray,消息:chararray);
B = foreach A生成REGEX_EXTRACT(日期,'([A-Za-z] )[A-Za-z] [1-31] [1-9] :[1-9 ]:[1-9] * [A-Za-z] * [0-9] ',1)作为日子:chararray, (日期,'[A-Za-z] ([A-Za-z] )[1-31] [1-9] :[1-9 *]:[ 1-9] * [A-Za-z] * [0-9] *',1)月份:chararray ......