Hadoop 在猪身上,把袋子压扁成一行

Hadoop 在猪身上,把袋子压扁成一行,hadoop,apache-pig,Hadoop,Apache Pig,在我的Pig脚本(0.9.2)中,我的最终输出如下所示: final:{email:chararray,{(name:chararray,percent:double)}} 其中,对于每个电子邮件地址,我最多有3个姓名和分数。因此,输出将如下所示: joe@smith.com{(乔·史密斯,0.5),(约瑟夫,0.1),(乔伊,0.1)} 我真正想做的是将其展平为选项卡式的delimted值(没有括号或大括号),以便更轻松地拉入MySQL表,如下所示: joe@smith.com乔·史密斯0.5

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

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

其中,对于每个电子邮件地址,我最多有3个姓名和分数。因此,输出将如下所示:

joe@smith.com{(乔·史密斯,0.5),(约瑟夫,0.1),(乔伊,0.1)}

我真正想做的是将其展平为选项卡式的delimted值(没有括号或大括号),以便更轻松地拉入MySQL表,如下所示:

joe@smith.com乔·史密斯0.5约瑟夫0.1乔伊0.1


我怎样才能在猪身上做到这一点?还是我必须编写自定义自定义自定义项

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

我编写了一个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();

    }
}
公共类BagToString扩展了EvalFunc{
@凌驾
公共字符串exec(元组输入)引发IOException{
数据包=(数据包)输入。获取(0);
迭代器bagIT=bag.Iterator();
字符串分隔符=“\t”;
StringBuilder sb=新的StringBuilder();
while(bagIT.hasNext()){
Tuple tupleInBag=bagIT.next();
sb.append(tupleInBag.toDelimitedString(分隔符)).append(分隔符);
}
使某人返回字符串();
}
}

Eli,这不是还有{}在项目周围吗?我的错。误读了最后的要求。我想,你可以把返回的东西展平,然后得到你想要的东西。