如何从一个包中获得很少的值?

enyaitl3  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(169)

我有这样的文件:

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和age:

({(1,36),(4,47)})
({(2,55),(5,66)})
({(3,44),(6,88)})

你能至少建议一下第一步吗?
当做
棘爪

4nkexdtk

4nkexdtk1#

与前面建议的解决方案类似,使用alias(参考: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)})
gg58donl

gg58donl2#

我找到了解决办法:

b = foreach a generate $0.($0,$3);

给出预期结果:

({(1,36),(4,47)})
({(2,55),(5,66)})
({(3,44),(6,88)})

很简单,但不是很明显。。。

q5lcpyga

q5lcpyga3#

加载数据后 a clias然后你可以用下面的,

b = foreach a generate b1.(id,age);
dump b;

与您的代码(涉及$0,$3)相比,此代码的优点是可读性和可理解性更强。

相关问题