在LOAD之后将元组字段拆分为更多字段

时间:2013-09-27 14:07:39

标签: apache-pig

我有一堆看起来像这样的系统日志数据......

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个字段的元组,(日,月,数字日,时间,时区,年份,主持人,消息)

我假设如果我想使用相同的技术来回答这个问题,我可以继续分配时间:如果我想,或者带有一些价值的信息。

2 个答案:

答案 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 ......

像上面这样的东西很可能会起作用,虽然我的正则表达式可能会变得更简单,如果我考虑更长时间。