2017-11-25 5 views
0

I는 다음과 같습니다 데이터가 다음과 같은 출력을 생성 DISTINCT 같은 것이선택 행

(a,b,c) 
(a,c,b) 
(a,b,d) 

있습니까?

(a,b,c) 
(a,b,d) 

나는 순서를 무시하고 그냥 요소를 비교하고 싶습니다.

답변

0

아니요. 가장 좋은 옵션은 각 행을 가져 와서 필드를 정렬하고 순서가 지정된 문자열을 반환 한 다음 고유하게 사용하는 UDF를 작성하는 것입니다.

돼지

REGISTER ORDER_UDF.jar; 
A = LOAD 'data.txt' USING PigStorage(',') AS (a1: chararray, a2: chararray, a3: chararray); 
B = FOREACH A GENERATE ORDER_UDF.ORDER(CONCAT(CONCAT(a1,a2),a3)); 
C = DISTINCT B; 
D = FOREACH C GENERATE REPLACE($0,'',','); -- Get back the comma separated fields from the concatenated string. 
DUMP D; 

UDF 고민의 가치

import java.io.IOException; 
    import java.util.Arrays; 
    import org.apache.pig.EvalFunc; 
    import org.apache.pig.data.Tuple; 

    public class ORDER extends EvalFunc<String> 
    { 
    public String exec(Tuple input) throws IOException { 
     if (input == null || input.size() == 0) 
      return null; 
     try{ 
      char tempArray[] = ((String)input).toCharArray(); 
      Arrays.sort(tempArray);  
      return new String(tempArray); 
     }catch(Exception e){ 
      throw new IOException("Caught exception processing input row ", e); 
     } 
    } 
    } 
1

생각, 내가 읽고 가방에 데이터를 변환, 가방을 정렬하고 서로 다른 데이터를 선택하는 것이 좋습니다 것입니다.

돼지 스크립트 :

inp_data = load 'input.csv' USING PigStorage(',') AS (field1:chararray,field2:chararray,field3:chararray); 
req_data = FOREACH inp_data GENERATE TOBAG(field1,field2,field3) AS (b:bag{t:(token:chararray)}); 
sorted_data = FOREACH req_data { 
       sorted = ORDER b BY token; 
       GENERATE sorted AS (sorted_bag:bag{t:(token:chararray)}); 
} 

req_data_fmt = DISTINCT(FOREACH sorted_data GENERATE BagToString(sorted_bag,',')); 

DUMP req_data_fmt;