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

How to turn (A, B, C) into (AB, AC, BC) with Pig?

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

做这样的事情的唯一方法是编写 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;
    }
}