目标:在展平的chararray数据上使用字符串函数
输入:test.txt
file_id file_name created_time accesssed_by
1 a1 1 user1
1 a2 2 user1
2 b1 3 user1
3 c1 4 user1
猪脚本:
A = LOAD 'usertest.txt' USING PigStorage('\t') AS (file_id:long, file_name:chararray, created_time:long,accessed_by:chararray);
B = GROUP A BY file_id;
C = FOREACH B {
sorted = ORDER A BY created_time DESC;
user = A.accessed_by;
uniq_user = DISTINCT user;
last = LIMIT sorted 1;
GENERATE UPPER(FLATTEN(last.file_name)) AS file_name, COUNT(uniq_user) AS access_count;
};
尝试在展平的chararray数据类型之上使用任何字符串操作函数会导致下面的错误。
ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200: <line 185, column 22> mismatched input 'FLATTEN' expecting RIGHT_PAREN
不使用FLATTEN顶部的字符串操作功能将导致所需的数据。
(a2,1)
(b1,1)
(c1,1)
目标是在持久化之前使用一些字符串操作函数将file_name转换为所需的格式,而不进行另一次迭代的数据。
如下所示再进行一次迭代,我们可以实现目标,我们可以避免这种情况并提前做同样的事情。
D = FOREACH C GENERATE UPPER(file_name) AS file_name, access_count;
输出
(A2,1)
(B1,1)
(C1,1)
更新:
基于@Balduz输入使用BagToString eval函数将包转换为String并且能够实现我们的目标。
C = FOREACH B {
sorted = ORDER A BY created_time DESC;
user = A.accessed_by;
uniq_user = DISTINCT user;
last = LIMIT sorted 1;
GENERATE UPPER(BagToString(last.file_name)) AS file_name, COUNT(uniq_user) AS access_count;
};
答案 0 :(得分:2)
UPPER
函数接受一个字符串,但由于file_name
包含一个包,当你展平它时,你将一个字符串列表传递给该函数,因此出错。如果你真的想避免这种额外的foreach,你需要编写一个与UPPER
完全相同的自定义UDF,但需要输入一个包。然后,您需要做同样的事情,但先调用UPPER
并在此之后展平:
GENERATE FLATTEN(MyUpperForBags(last.file_name));