2015-05-01 1 views
2

В Pig, учитывая следующую Сумку: (A, B, C), могу ли я как-то вычислить уникальные комбинации всех значений? Результат, который я ищу, это что-то вроде (AB, AC, BC). Я игнорирую BA, CA, CB, так как они будут дублировать существующие значения, если они отсортированы в алфавитном порядке.Как превратить (A, B, C) в (AB, AC, BC) с Pig?

+4

как насчет написания UDF? – Mzf

ответ

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; 
    } 
}