如何用猪将(A,B,C)变成(AB,AC,BC)?

时间:2015-05-01 20:02:08

标签: hadoop apache-pig

在Pig中,给出以下Bag:(A,B,C),我能以某种方式计算所有值的独特组合吗? 我正在寻找的结果是(AB,AC,BC)。 我无视BA,CA,CB,因为如果按字母顺序排序,它们将成为现有值的副本。

1 个答案:

答案 0 :(得分:2)

做这样的事情的唯一方法是编写UDF。这个将完全符合您的要求:

public class CombinationsUDF extends EvalFunc<DataBag> {
    public DataBag exec(Tuple input) throws IOException {
        List<Tuple> bagValues = new ArrayList<Tuple>();
        Iterator<Tuple> iter = ((DataBag)input.get(0)).iterator();
        while (iter.hasNext()) {
            bagValues.add(iter.next());
        }

        List<Tuple> outputTuples = new ArrayList<Tuple>();
        for (int i = 0; i < bagValues.size() - 1; i++) {
            List<Object> currentTupleValues = bagValues.get(i).getAll();

            for (int j = i + 1; j < bagValues.size(); j++) {
                List<Object> aux = new ArrayList<Object>(currentTupleValues);
                aux.addAll(bagValues.get(j).getAll());
                outputTuples.add(TupleFactory.getInstance().newTuple(aux));
            }
        }

        DataBag output = BagFactory.getInstance().newDefaultBag(outputTuples);
        return output;
    }
}