如何加载和处理MapPig的数据?

exdqitrt  于 2021-06-25  发布在  Pig
关注(0)|答案(3)|浏览(309)

我有以下格式的数据:

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时间戳转换为datetime。消息之间用空格隔开,消息的长度不是恒定的。当我试图加载数据时 pig-storage('') (由于消息位之间用空格隔开),它将消息的下一位作为其他列数据进行检索。
在上面的例子中,如果我生成主机名,它会给我消息的请求位。在pig中是否有处理map等数据的具体方法?我试着用 TO-MAP 但未能实现所需的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 剩下的部分数据作为Map?

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

问题:
有谁能指导我在pig中以map的形式加载数据吗?
有人能提供一些关于在pig中加载/处理map数据的建议吗?

**所需Map:

source#indiana 

service#service2q

msg#"processing  request" 

hostname#host1

requestid#ec2cerd22**
xmjla07d

xmjla07d1#

据我所知,你的问题不在于创建Map,而在于你希望Pig尊重这个事实 " 标记在数据中,而不是在它们之间的空格上拆分。如果你知道的话 msg 只有一个字段会有这样的引号,这里有一个黑客:

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);

然后你就走了。你不需要Map。

ohfgkhjo

ohfgkhjo2#

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

----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的输出是一个元组,但我得到一个空的map对象,没有输出值。在pig0.11上似乎不允许动态创建Map

tpgth1q7

tpgth1q73#

据我所知,您不能使用任何内置函数将数据作为Map加载,因为文件中缺少[]来显示Map开始和Map结束。
话虽如此,我想我已经弄明白你的tomap失败的原因了。Map是由键值对组成的,因此tomap的输入必须是偶数,因为它将每一列作为键,每一列作为值。您的tomap正好有七个参数,只剩下最后一个value参数丢失。如果要将所有数据与一个键关联,可以执行以下操作:
(例如,假设源是键)
tomapdata=foreach data生成myudf.test(dt)为date,tomap(source,totuple(service,info,serviceid,msg,hostname,requestid))为m;
这将有一个键的源,和一个值为其他所有元组。
如果您只是忘记添加一列,只需将该列添加到tomap的末尾,就可以了。
相反,如果您只是简单地将所有内容作为一个集合来获取,并且将其包含在键值对中并不重要,那么您可以使用totuple或tobag。

相关问题