在展平的字符数组数据上使用字符串函数
Using String functions on flattened chararray data
Objective:在扁平化的字符数组数据上使用字符串函数
输入: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)
Objective 是使用一些字符串操作函数将 file_name 转换为所需的格式,然后再持久化,而无需再次迭代数据。
再进行一次迭代,如下所示,我们能够实现我们的 objective,我们可以避免这种情况并早点做同样的事情吗?
D = FOREACH C GENERATE UPPER(file_name) AS file_name, access_count;
输出:
(A2,1)
(B1,1)
(C1,1)
更新:
基于@Balduz 使用 BagToString eval 函数将包输入转换为字符串,并能够实现我们的 objective。
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;
};
UPPER
函数接受一个字符串,但由于 file_name
包含一个包,当您将其展平时,您会将一个字符串列表传递给该函数,因此会出现错误。如果您真的想避免额外的 foreach,您将需要编写一个与 UPPER
完全相同的自定义 UDF,但将一个包作为输入。然后,您需要做同样的事情,但先调用 UPPER
然后再展平:
GENERATE FLATTEN(MyUpperForBags(last.file_name));
Objective:在扁平化的字符数组数据上使用字符串函数
输入: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)
Objective 是使用一些字符串操作函数将 file_name 转换为所需的格式,然后再持久化,而无需再次迭代数据。
再进行一次迭代,如下所示,我们能够实现我们的 objective,我们可以避免这种情况并早点做同样的事情吗?
D = FOREACH C GENERATE UPPER(file_name) AS file_name, access_count;
输出:
(A2,1)
(B1,1)
(C1,1)
更新:
基于@Balduz 使用 BagToString eval 函数将包输入转换为字符串,并能够实现我们的 objective。
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;
};
UPPER
函数接受一个字符串,但由于 file_name
包含一个包,当您将其展平时,您会将一个字符串列表传递给该函数,因此会出现错误。如果您真的想避免额外的 foreach,您将需要编写一个与 UPPER
完全相同的自定义 UDF,但将一个包作为输入。然后,您需要做同样的事情,但先调用 UPPER
然后再展平:
GENERATE FLATTEN(MyUpperForBags(last.file_name));