使用pig从键值对中获取n个值

rqenqsqc  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(259)

我有一个测试文件,其中键和值用coma分隔。如何使用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

5q4ezhmt

5q4ezhmt1#

有很多不同的方法可以做到这一点,具体取决于你有什么作为输入和输出的需要。我假设您只需要前10个值,其余的值可以直接抛出。
这就是我要做的(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)

相关问题