【问题标题】:Using String functions on flattened chararray data对展平的 chararray 数据使用字符串函数
【发布时间】:2015-06-29 09:11:36
【问题描述】:

目标:在扁平化的 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)

目标是在持久化之前使用一些字符串操作函数将文件名转换为所需的格式,而无需进行数据的另一次迭代。

再进行一次迭代,如下所示,我们能够实现我们的目标,我们能否避免这种情况并早点做同样的事情。

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

【问题讨论】:

    标签: string function apache-pig uppercase flatten


    【解决方案1】:

    UPPER 函数接受一个字符串,但由于file_name 包含一个包,所以当您将其展平时,您会将字符串列表传递给函数,因此会出现错误。如果您真的想避免这种额外的 foreach,您将需要编写一个与 UPPER 完全相同的自定义 UDF,但将一个包作为输入。然后,您需要做同样的事情,但首先调用UPPER,然后再进行展平:

    GENERATE FLATTEN(MyUpperForBags(last.file_name));
    

    【讨论】:

    • 感谢@Balduz,根据您的输入:使用 BagToString eval 函数将 bag 转换为 String,并且能够实现我们的目标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    相关资源
    最近更新 更多