加载后将元组字段拆分为更多字段

g2ieeal7  于 2021-06-25  发布在  Pig
关注(0)|答案(2)|浏览(413)

我有一堆系统日志数据看起来像这样。。。
周一1月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个字段的元组。下面是我遇到的问题。这是伪代码,因为我似乎不能得到它的权利。我觉得提取物可能是我要找的,但结果不对。
我想做的是把每个字段进一步拆分,就像

B = FOREACH A <split> date USING PigStorage(' ') AS (
day:chararray,
month:chararray,
numday:int,
time:chararray,
timezone:chararray,
year:int);

所以现在我将有一个包含8个字段的元组,(day,month,numday,time,timezone,year,host,message)
我假设,如果我想使用回答这个问题的相同技巧,我可以继续将时间分割为:如果我想,或者具有某种价值的消息。

tez616oj

tez616oj1#

对于这样的任务,首先想到的方法是regex\u extract(),请尝试以下操作:
a=使用pigstorage('\t')作为()加载'/syslogfiles'date:chararray, host:chararray, message:chararray);
b=foreach a generate regex_extract(date,'([a-za-z])[a-za-z][1-31][1-9]:[1-9]:[1-9][a-za-z][0-9]',1)如下day:chararray,(日期,“[a-za-z]([a-za-z])[1-31][1-9]:[1-9*]:[1-9][a-za-z][0-9]*',1)作为month:chararray ...
像上面这样的东西可能会起作用,尽管我的正则表达式可能会变得更简单,如果我考虑的时间更长。

nue99wik

nue99wik2#

你在找 STRSPLIT 内置自定义项。返回一个元组。它基本上是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}

相关问题