怎么从猪袋里得到的价值很少?

时间:2015-05-15 20:50:19

标签: hadoop apache-pig

我的文件是这样的:

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

3 个答案:

答案 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)相比,此代码的优势在于,它更具可读性和优势。可以理解的。