apache pig group by output - 删除“(”和“{”

时间:2013-01-28 19:54:07

标签: apache-pig

我执行以下操作:

a = load '/hive/warehouse/' USING PigStorage('^') as (a1,b1,c1);

b = group a by (a1) ;

c = foreach b generate group, a.$2;

dump c;

输出显示所有组:

abc  {(1),(44),(66)}
cde  {(1),(44),(66)}

如何删除“{”和“(”字符以便最终的HDFS文件可以作为逗号分隔文件读取?

3 个答案:

答案 0 :(得分:3)

你不能直接在Pig中这样做。需要特殊的语法,因为你正在存放一个包,为了让Pig能够在以后读取这个包,它需要与大括号(用于包)和括号(包含在包中的元组)一起存储。

你有几个选择。您可以将文件读回Pig,但不要将其作为bag阅读,而应将其读作chararray。然后你可以执行正则表达式替换来摆脱标点符号(未经测试):

a = LOAD 'output' AS (group:chararray, list:chararray);
b = FOREACH A GENERATE group, REPLACE(list, '[{()}]', '');

另一种选择是编写一个UDF,将一个包变成一个元组。请注意,这不是一个明确定义的操作:行李没有特定的顺序,所以从一次运行到下一次运行,你的元组不能保证在同一个顺序。但就你的目的而言,听起来可能并不重要。 UDF可能看起来像(草稿非常粗糙,未经测试):

public class BAG_TO_TUPLE extends EvalFunc(Tuple) {
    public Tuple exec(Tuple input) {
        DataBag bag = input.get(0);
        Iterator<Tuple> iterator = bag.iterator();

        Tuple out = new DefaultTuple();
        while(iterator.hasNext()) {
            out.append(iterator.next().get(0));   
        }

        return out;
    }
}

上面的UDF非常糟糕 - 它假设你在包的每个元组中都有一个元素(你关心的)并且没有检查输入是否有效等等。但它应该让你走向什么你想要的。

但是,最好的解决方案是找到一种方法来处理Pig之外的额外标点符号,如果Pig不是您下游处理的一部分。

答案 1 :(得分:1)

此功能现在在Pig中作为内置函数提供(我使用0.11)。

http://pig.apache.org/docs/r0.11.0/api/org/apache/pig/builtin/BagToString.html

c = foreach b generate group, a.$2 as stuff;
d = foreach c generate group, BagToString(stuff, ',');

我的用例不需要以逗号分隔的文件,但我假设你可以使用store func来获取最终的逗号(在group和now-逗号分隔的包之间)

答案 2 :(得分:0)

尝试FLATTEN运算符;

c = foreach b生成组,FLATTEN(a。$ 2);