在Pig中,将一个袋子展平成一条线

时间:2013-05-07 00:21:24

标签: hadoop apache-pig

在我的Pig脚本(0.9.2)中,我的最终输出如下所示:

final: {email: chararray,{(name: chararray,percent: double)}}

对于每个电子邮件地址,我最多有3个姓名和分数。所以,输出看起来像这样:

joe@smith.com {(Joe Smith, 0.5),(Joseph, 0.1), (Joey, 0.1)}

我真正想做的是将其展平为带标签的分隔值(没有括号或花括号),以便更容易将这样的内容拉入这样的表:

joe@smith.com Joe Smith 0.5 Joseph 0.1 Joey 0.1

我怎样才能在Pig中实现这一目标?或者我必须编写自定义UDF?

2 个答案:

答案 0 :(得分:5)

您需要为此编写自定义udf。您可以使用Python等语言轻松完成。做一些像:

@outputSchema("flat_bag:bag{}")
def flattenBag(bag):
    flat_bag = [item for tup in bag for item in tup]
    return flat_bag

将它放入.py文件并加载它:

REGISTER '/path/to/udfs.py' using jython as py_funcs;

然后使用它:

final1 = FOREACH final GENERATE email, py_funcs.flattenBag($1);

答案 1 :(得分:3)

我编写了一个Java UDF,它可以很好地用于一堆元组。 Tuple.toDelimitedString是关键。

public class BagToString extends EvalFunc<String> {

    @Override
    public String exec(Tuple input) throws IOException {
        DataBag bag = (DataBag) input.get(0);
        Iterator<Tuple> bagIT = bag.iterator();
        String delimiter = "\t";

        StringBuilder sb = new StringBuilder();
        while(bagIT.hasNext()){
            Tuple tupleInBag = bagIT.next();
            sb.append(tupleInBag.toDelimitedString(delimiter)).append(delimiter);
        }

        return sb.toString();

    }
}