我的文件是这样的:
cat > hdfs_bag.txt
{(1,pawel,kowalski,36),(4,pawel,kowalski,47)}
{(2,john,smith,55),(5,john,smith,66)}
{(3,paul,psmithski,44),(6,paul,psmithski,88)}
然后加载它将它转换成一个包:
grunt> a = load 'hdfs_bag.txt' as (b1 : bag { k1:tuple (id, name, surname, age)});
grunt> describe a;
a: {b1: {k1: (id: bytearray,name: bytearray,surname: bytearray,age: bytearray)}}
我想要实现的结果是包含两个仅包含id和年龄的元组的包:
({(1,36),(4,47)})
({(2,55),(5,66)})
({(3,44),(6,88)})
你能否至少建议第一步?
关心
的Pawel
答案 0 :(得分:0)
我找到了解决方案:
b = foreach a generate $0.($0,$3);
按预期得出结果:
({(1,36),(4,47)})
({(2,55),(5,66)})
({(3,44),(6,88)})
这么简单,但不那么明显......
答案 1 :(得分:0)
与之前建议的解决方案类似,使用别名访问字段(参考:http://pig.apache.org/docs/r0.10.0/basic.html#relations)
,而不是位置表示法 A = LOAD 'hdfs_bag.txt' USING PigStorage('\t') AS (b1 : bag { k1:tuple (id:int, name:chararray, surname:chararray, age:int)});
B = FOREACH A GENERATE b1.(id,age);
输出
({(1,36),(4,47)})
({(2,55),(5,66)})
({(3,44),(6,88)})
答案 2 :(得分:0)
在a
clias中加载数据后,您可以使用以下内容
b = foreach a generate b1.(id,age);
dump b;
与您的代码(涉及$ 0,$ 3)相比,此代码的优势在于,它更具可读性和优势。可以理解的。