猪和解析问题

时间:2015-05-21 08:40:23

标签: apache-pig

我试图找出在具有混合分隔符的数据集中使用Pig解析键值对的最佳方法,如下所示

我的样本数据集采用以下格式

 a|b|c|k1=v1 k2=v2 k3=v3

我需要的最终输出是

k1,v1,k2,v2,k3,v3

我想一种方法是

A = load 'sample' PigStorage('|') as (a1,b1,c1,d1);
B = foreach A generate d1;

这里我得到(k1=v1 k2=v2 k3=v3)代表B. 有什么方法可以通过""进一步解析这个问题,以便得到3个字段k1=v1,k2=v2K3=v3,然后可以使用Strsplit和Flatten k1,v1,k2,v2,k3,v3进一步拆分为"=" {1}}。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如果您事先知道每条记录中有多少个key = value对,请尝试:

A = load 'sample' PigStorage('|') as (a1,b1,c1,d1);

B = foreach A generate d1;

C = FOREACH B GENERATE STRSPLIT($0,'=',6);  -- 6= no. of key=value pairs

D = FOREACH C GENERATE FLATTEN($0);

DUMP D

输出: (k1,v1,k2,v2,k3,v3)

如果您不知道key = value对的#,请使用''作为分隔符并从$ 0列中删除不需要的前缀。

A = LOAD 'sample' USING PigStorage(' ') as (a:chararray,b:chararray,c:chararray);

B = FOREACH A GENERATE STRSPLIT(SUBSTRING(a, LAST_INDEX_OF(a,'|')+1, (int)SIZE(a)),'=',2),STRSPLIT(b,'=',2),STRSPLIT(c,'=',2);

C = FOREACH B GENERATE FLATTEN($0), FLATTEN($1), FLATTEN($2);

DUMP C;

输出: (k1,v1,k2,v2,k3,v3)