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