在猪拉丁中选择行

时间:2017-11-25 07:14:40

标签: apache-pig

我的数据如下:

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

DISTINCT之类的东西会产生如下的输出吗?

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

我想忽略顺序,只是比较元素。

1 个答案:

答案 0 :(得分:0)

不是。你最好的选择是编写一个UDF,它将获取每一行,对字段进行排序并返回一个有序的字符串,然后在其上使用distinct。

<强> PIG

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