Pig生成一个关键更改列 - 将先前记录与当前记录进行比较,但不同列

时间:2016-06-20 06:54:59

标签: hadoop mapreduce apache-pig window-functions pig-udf

我的输入数据将采用以下格式。

   col1 col2   col3     effective date expiry date
1   Q1    A1  Value1     01/01           01/02
2   Q1    A1  Value1     01/02           01/03
3   Q1    A1  Value1     01/03           01/05
4   Q1    A1  Value2     01/05           01/06
5   Q1    A1  Value2     01/06           01/07
6   Q1    A1  Value2     01/07           01/08
7   Q1    A1  Value1     01/08           01/11
8   Q1    A1  Value1     01/11           12/31

我需要根据col1,col2,col3的值删除重复项,但不是所有重复项。直到col3的值更改为不同值的记录 被视为重复。例如。在上述数据中,值1在第4条记录中变为值2,因此在记录1,2和3中,只保留第1条记录。 在记录4,5和6中,只保留第4。在记录7和8中,只保留7个。最后两列实际上是日期列(有效 和到期日)。像1,2和3这样的重复可能会多次出现(如1,2,3,4和5可能具有相同的值),或者根本不会有重复。

我有两种方法,但不确定如何为其中任何一种编码。

  1. 所以我在考虑生成一个keychange列(1或0),它将所有dupes和key(col1,col2,col3的组合)的值从1更改为0 更改时,此keychange列的值应设置为1.然后我可以过滤此列。 但为此我需要编写一个UDF(或者是否有任何具有类似功能的UDF?),因为这需要输入在传递给udf时按排序顺序, 是否可以将已排序的数据传递给udf?如果是这样,怎么样?这应该是什么样的UDF? 或者即使我写了mapreduce代码,我应该如何继续,如果我只是在mapper中发出记录并进行所有排序 并在reducer中生成列?请让我知道你的输入(mapreduce编程的新功能,所以你的想法会对我学习很多,谢谢!)。

  2. 当我浏览“over”函数文档时,它只比较了以前的记录和当前记录的相同列,如果不知怎的话我可以比较col5(到期日期) 根据col4(生效日期)按升序排序后,下一条记录的col4(生效日期)的当前记录,我可以通过Col1,col2和Col3进行分组 并删除那些生效日期与之前记录的到期日相同的记录。但不确定如何使用over函数比较两个不同的列。 请告诉我你对这个问题的想法。

  3. 如果还有其他更好的解决方法,请告诉我。谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

假设 - 输入是CSV文件。

A = LOAD 'test.csv' using PigStorage(',');
B = GROUP A BY $0,$1,$2;
C = FOREACH B {
 D = LIMIT A 1;
 GENERATE D.$0,D.$1,D.$2,D.$3,D.$4;
}
DUMP C;

希望这有帮助。