我的输入数据将采用以下格式。
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可能具有相同的值),或者根本不会有重复。
我有两种方法,但不确定如何为其中任何一种编码。
所以我在考虑生成一个keychange列(1或0),它将所有dupes和key(col1,col2,col3的组合)的值从1更改为0 更改时,此keychange列的值应设置为1.然后我可以过滤此列。 但为此我需要编写一个UDF(或者是否有任何具有类似功能的UDF?),因为这需要输入在传递给udf时按排序顺序, 是否可以将已排序的数据传递给udf?如果是这样,怎么样?这应该是什么样的UDF? 或者即使我写了mapreduce代码,我应该如何继续,如果我只是在mapper中发出记录并进行所有排序 并在reducer中生成列?请让我知道你的输入(mapreduce编程的新功能,所以你的想法会对我学习很多,谢谢!)。
当我浏览“over”函数文档时,它只比较了以前的记录和当前记录的相同列,如果不知怎的话我可以比较col5(到期日期) 根据col4(生效日期)按升序排序后,下一条记录的col4(生效日期)的当前记录,我可以通过Col1,col2和Col3进行分组 并删除那些生效日期与之前记录的到期日相同的记录。但不确定如何使用over函数比较两个不同的列。 请告诉我你对这个问题的想法。
如果还有其他更好的解决方法,请告诉我。谢谢你的时间!
答案 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;
希望这有帮助。