在pig中,将一个包压扁成一行

zqdjd7g9  于 2021-06-24  发布在  Pig
关注(0)|答案(2)|浏览(285)

在我的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)} 我真正想做的是将其展平为带制表符的delimted值(没有括号或大括号),以便更轻松地拉入mysql表,如下所示: joe@smith.com Joe Smith 0.5 Joseph 0.1 Joey 0.1 我怎样才能在Pig身上做到这一点?或者我必须编写自定义自定义自定义项?

bwntbbo3

bwntbbo31#

我编写了一个javaudf,它可以很好地处理一包元组。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();

    }
}
drnojrws

drnojrws2#

您需要为此编写自定义自定义自定义项。用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);

相关问题