Apache pig 加载后将元组字段拆分为其他字段

Apache pig 加载后将元组字段拆分为其他字段,apache-pig,Apache Pig,我有一堆系统日志数据,看起来像这样 周一1月1日00:00:01 UTC 1970服务器名调试crond[123456]:系统消息告诉我一些事情 我不确定它在这里的格式中是否可见,但ServerName的每一侧都有一个制表符,用于拆分字符串。所以一开始加载它很容易 A = LOAD '/syslogfiles' USING PigStorage('\t') AS ( date:chararray, host:chararray, message:chararray); 现在我有一个有3个字段的

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

周一1月1日00:00:01 UTC 1970服务器名调试crond[123456]:系统消息告诉我一些事情

我不确定它在这里的格式中是否可见,但ServerName的每一侧都有一个制表符,用于拆分字符串。所以一开始加载它很容易

A = LOAD '/syslogfiles' USING PigStorage('\t') AS (
date:chararray,
host:chararray,
message:chararray);
现在我有一个有3个字段的元组。这是我遇到麻烦的下一部分。这是伪代码,因为我似乎无法正确理解它。我觉得提取物可能是我要找的,但结果不对劲

我想做的是将这些字段进一步拆分,如下所示

B = FOREACH A <split> date USING PigStorage(' ') AS (
day:chararray,
month:chararray,
numday:int,
time:chararray,
timezone:chararray,
year:int);
B=使用PigStorage(“”)作为(
日期:查拉雷,
月份:查拉雷,
numday:int,
时间:查拉雷,
时区:chararray,
年份:整数);
现在我有了一个包含8个字段的元组(天、月、numday、时间、时区、年、主机、消息)


我假设,如果我想使用与回答这个问题相同的技术,我可以继续将时间分割为:如果我想,或者具有某个值的消息。

您正在查找内置UDF中的STRSPLIT。这将返回一个元组。它基本上是Java应用程序的包装器。如果提供
limit
参数,则元组的长度是可预测的,然后可以使用
flant
将字段提升到顶层:

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}

对于这样的任务,首先想到的方法是REGEX_EXTRACT(),请尝试以下方法:

A=使用PigStorage('\t')作为(日期:chararray, 主机:chararray,消息:chararray)

B=每个A生成正则表达式提取(日期,([A-Za-z])[A-Za-z] [1-31][1-9]:[1-9]:[1-9]*[A-Za-z]*[0-9]',1)作为日期:查拉雷, (日期,[A-Za-z]([A-Za-z])[1-31][1-9]:[1-9*]:[1-9]*[A-Za-z]* [0-9]*',1)作为月份:chararray


像上面这样的东西可能会起作用,不过如果我想得久一点,我的正则表达式可能会变得更简单

最好是
REGEX\u EXTRACT\u ALL
,这样您只需运行一次REGEX。