我的数据格式如下:
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
但未能实现所需的地图转换。
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**
答案 0 :(得分:0)
据我所知,你不能使用任何内置函数将这些数据作为地图加载,因为文件中缺少[]来显示地图开始和地图结束。
话虽如此,我想我已经弄清楚了为什么你的TOMAP失败了。映射由键值对组成,因此TOMAP的输入必须是偶数,因为它将每个第一列作为键,并将每第二列作为值。你的TOMAP有七个参数,只剩下最后一个值参数。如果您希望将所有数据与一个密钥相关联,请执行以下操作:
(例如,假设源是密钥)
tomapdata = FOREACH数据生成myudf.test(dt)作为日期, TOMAP(源,TOTUPLE(服务,信息,服务ID,味精,主机名,将requestId))作为 米;
这将包含密钥的源,以及其他所有值的元组作为值。
如果您只是忘记添加一个列,只需在TOMAP的末尾添加一个列,它应该可以正常工作。
如果你试图简单地将所有东西都作为一个集合,并且在键值对中拥有它并不重要,那么你可能只能使用TOTUPLE或TOBAG。
答案 1 :(得分:0)
我可以说,你的问题不在于创建地图,而在于你希望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);
然后离开你。你不需要地图。
答案 2 :(得分: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似乎不允许动态地图创建。