2

在我的 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)}

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

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

我怎样才能在 Pig 中做到这一点?还是我必须编写自定义 UDF?

4

2 回答 2

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);
于 2013-05-07T01:26:40.060 回答
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();

    }
}
于 2013-05-08T19:02:28.693 回答