在平坦字符数据上使用字符串函数

fjnneemd  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(395)

目的:在平坦字符数据上使用字符串函数
输入: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

Pig脚本:

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;
};

尝试在扁平字符数据类型上使用任何字符串操作函数都会导致以下错误。

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)

目标是使用一些字符串操作函数将文件名转换为所需的格式,然后再持久化,而无需对数据进行另一次迭代。
再进行一次如下的迭代,我们就能够实现我们的目标,我们是否可以避免这种情况,并且更早地做同样的事情。

D = FOREACH C GENERATE UPPER(file_name) AS file_name, access_count;

输出:

(A2,1)
 (B1,1)
 (C1,1)

更新:
基于@balduz输入,使用bagtostring eval函数将bag转换为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;
       };
wooyq4lh

wooyq4lh1#

这个 UPPER 函数接受字符串,但因为 file_name 包含一个包,当您展平它时,您将向函数传递一个字符串列表,因此会出现错误。如果您真的想避免额外的foreach,那么您需要编写一个与 UPPER 但是拿一个袋子作为输入。然后,你需要做同样的你正在做的,但打电话 UPPER 首先,然后变平:

GENERATE FLATTEN(MyUpperForBags(last.file_name));

相关问题