0

我有以下格式的数据:

isotimestamp source service info serviceid msg hostname requsetid

2013-08-22T13:23:18.226220+01:00  indiana  service2q  info  255  " processing  
request "  host1   e2cerd22  

我能够通过 UDF 将 ISO 时间戳转换为日期时间。消息由空格分隔,消息的长度不是恒定的。当我尝试通过pig-storage('')(因为消息位由空格分隔)加载数据时,它正在检索下一位消息作为其他列数据。

在上面的示例中,如果我生成主机名,它会给我消息的请求位。是否有任何特定的方法来处理 Pig 中的 MAP 等数据?我尝试使用TO-MAP但未能实现所需的地图转换。

tomapdata = FOREACH data GENERATE  myudf.test(dt)as date, 
            TOMAP(source,service,info,serviceid,msg,hostname,requestid)as m;

getdata = FOREACH tomapdata GENERATE dt, m#hostname, m#serviceid;

是否可以将日期chararray和数据的剩余部分作为地图加载?

load 'data.log' as (dt:chararray , m:MAP[chararray] ); 
Foreach data generate m#source ; 

问题 :

任何人都可以指导我将数据加载为猪中的 MAP 吗?
谁能提供一些关于在 Pig 中将数据加载/处理为 MAP 的建议?

**必填地图:

source#indiana 

service#service2q

msg#"processing  request" 

hostname#host1

requestid#ec2cerd22**
4

3 回答 3

0

据我所知,您不能使用任何内置函数将该数据加载为地图,因为文件中缺少显示地图开始和地图结束的 []。

话虽如此,我想我已经弄清楚了您的 TOMAP 失败的原因。映射由键值对组成,因此 TOMAP 的输入必须是偶数,因为它将每一列作为键,每隔一列作为值。您的 TOMAP 正好有七个参数,而最后一个值参数丢失了。如果您希望所有数据与一个键相关联,您可以执行以下操作:

(例如目的源被假定为关键)

tomapdata = FOREACH data GENERATE myudf.test(dt) as date, TOMAP(source,TOTUPLE(service,info,serviceid,msg,hostname,requestid)) as m;

这将具有键的来源,以及其他所有内容的元组作为值。

如果您只是忘记添加一列,只需在 TOMAP 末尾添加该列,它应该可以工作。

如果您想简单地将所有内容作为一个集合获取,并且将其放在键值对中并不重要,那么您可能只能使用 TOTUPLE 或 TOBAG。

于 2013-09-27T13:01:36.810 回答
0

据我所知,您的问题不在于创建地图,而在于您希望 Pig 尊重"数据中的标记,而不是在它们之间的空格上分割。如果您知道这msg是唯一会包含这样引号的字段,那么这里有一个 hack:

predata = LOAD 'input' USING PigStorage('"') AS (initial:chararray, msg:chararray, final:chararray);
data =
    FOREACH predata
    GENERATE
        FLATTEN(STRSPLIT(initial, ' ', 5) AS (
            isotimestamp:chararray,
            source:chararray,
            service:chararray,
            info:chararray,
            serviceid:chararray),
        msg,
        FLATTEN(STRSPLIT(final, ' ', 2) AS (
            hostname:chararray,
            requestid:chararray);

你走了。你不需要地图。

于 2013-09-27T15:46:39.543 回答
0

我很喜欢戴维斯布罗达对此的回答,但遗憾的是尝试了以下类似的东西:

----sample_data.txt
open,apache,another,pig
open,apache,apache,pig
apache,hadoop

----my.pig
A = LOAD '$input' AS chararray;
B = FOREACH A GENERATE
    STRSPLIT($0,',').$0 AS myvals:chararray
    , TOMAP(STRSPLIT($0,',').$0,STRSPLIT($0,',').$1) AS mymap:map [(i:chararray)];
-- this fails   , TOMAP(STRSPLIT($0,',')) AS mymap:map [(i:chararray)];
C = FOREACH B GENERATE $1#'open';
DUMP C;
DESCRIBE C;

$>pig -x local -param input=sample_data.txt my.pig
(apache)
(apache)
()
C: {(i: chararray)}

但不幸的是,虽然 STRSPLIT 的输出是一个元组,但我得到一个空的地图对象并且没有值。似乎在猪 0.11 上可能不允许动态地图创建

于 2013-12-12T19:53:29.120 回答