我试图找出在具有混合分隔符的数据集中使用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=v2
和K3=v3
,然后可以使用Strsplit和Flatten k1,v1,k2,v2,k3,v3
进一步拆分为"="
{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)