0

我有一个用逗号分隔键和值的测试文件。如何使用 pig 脚本为每个键仅获取 10 个值。

样本输入:john|str1,str2,str3,str4,str5,str6,str7,str8,str9,str10,str11,str2 ,首选输出:john|str1,str2,str3,str4,str5,str6,str7,str8, str9,str10

4

1 回答 1

2

有很多不同的方法可以做到这一点,具体取决于您作为输入和需要作为输出的确切内容。我假设你只想要前十个,剩下的值可以被丢弃。

这就是我会做的方式(CL)。它比short way (CF) 长一点,但代码对我来说更清晰,并且在命名模式时允许更大的灵活性:

A = LOAD 'myData' USING PigStorage('|') AS (name: chararray, vals: chararray) ;  
B = FOREACH A GENERATE name, STRSPLIT(vals, ',') AS svals: () ;  
CL = FOREACH B GENERATE name,
                        svals.($0, $1, $2, $3, $4, $5, $6, $7, $8, $9) AS ten ; 
                        -- ten can have a schema, like ten: (a1: chararray, etc.)
                        -- After giving it a schema, you can also flatten it to
                        -- make it like the output of CF, but with better types

这是 CL 的结果模式和输出:

CL: {name: chararray,ten: ()}
(john,(str1,str2,str3,str4,str5,str6,str7,str8,str9,str10))

这种方式更短一些,但更难将模式应用于值:

-- Uses the same A  
B = FOREACH A GENERATE name AS name, FLATTEN(STRSPLIT(vals, ',')) ;
CF = FOREACH B GENERATE $0 AS name: chararray, $1, $2 .. $10 ;

CF 的架构和输出:

CF: {name: chararray,bytearray,bytearray,bytearray,bytearray,bytearray,bytearray,bytearray,bytearray,bytearray,bytearray}
(john,str1,str2,str3,str4,str5,str6,str7,str8,str9,str10)
于 2013-07-05T17:50:39.797 回答