我有一个用逗号分隔键和值的测试文件。如何使用 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
我有一个用逗号分隔键和值的测试文件。如何使用 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
有很多不同的方法可以做到这一点,具体取决于您作为输入和需要作为输出的确切内容。我假设你只想要前十个,剩下的值可以被丢弃。
这就是我会做的方式(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)