복붙노트

[HADOOP] Pig로 (A, B, C)를 (AB, AC, BC)로 바꾸는 방법?

HADOOP

Pig로 (A, B, C)를 (AB, AC, BC)로 바꾸는 방법?

Pig에서 (A, B, C) 다음 백이 주어지면 어떻게 든 모든 값의 고유 조합을 계산할 수 있습니까? 내가 찾고있는 결과는 (AB, AC, BC)와 같습니다. 알파벳순으로 정렬하면 기존 값과 중복되므로 BA, CA, CB는 무시합니다.

해결법

  1. ==============================

    1.이와 같은 작업을 수행하는 유일한 방법은 UDF를 작성하는 것입니다. 이것은 당신이 원하는 것을 정확하게 할 것입니다 :

    이와 같은 작업을 수행하는 유일한 방법은 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;
        }
    }
    
  2. from https://stackoverflow.com/questions/29994246/how-to-turn-a-b-c-into-ab-ac-bc-with-pig by cc-by-sa and MIT license