如何用 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;
}
}
在 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;
}
}