我的输入数据将采用以下格式。
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的值变为不同的值之前,记录被视为重复记录。例如,在上述数据中,第4条记录中的值1变为值2,因此在记录1、2和3中只应保留第1条。在记录4、5和6中,只有第四个应该保留。在记录7和8中,只有7个应该保留。最后两列实际上是日期列(生效日期和到期日期)。像1、2和3这样的重复可能会出现很多次(像1、2、3、4和5可能有相同的值),或者根本就没有重复。
我想到了两种方法,但不知道如何为其中任何一种编写代码。
所以我在考虑生成一个keychange列(1或0),将所有dupe的值从1更改为0,当key(col1,col2,col3的组合)更改时,这个keychange列的值应该设置为1。然后我就可以过滤这个专栏了。但为此,我需要编写一个自定义项(或者是否有任何具有类似功能的自定义项可用?),因为这要求输入在传递到自定义项时按排序顺序进行,所以可以将排序后的数据传递到自定义项吗?如果是,怎么做?这应该是什么样的自定义项?或者即使我写了一个mapreduce代码,我应该如何继续,我应该仅仅在mapper中发出记录并在reducer中进行所有排序和生成列吗?请让我知道您的意见(对于mapreduce编程来说是新手,所以您的想法将对我的学习有很大帮助,谢谢!)。
当我浏览“over”函数文档时,它只比较前一个记录和当前记录的同一列,如果我能比较当前记录的col5(失效日期)和下一个记录的col4(生效日期),在按col4(生效日期)升序排序后,我可以按col1分组,col2和col3,并删除生效日期与前一个记录的到期日期相同的记录。但不知道如何使用over函数比较两个不同的列。请让我知道你对这件事的看法。
请告诉我是否有其他更好的方法来解决这个问题。谢谢你的时间!
1条答案
按热度按时间jhkqcmku1#
假设-输入是一个csv文件。
希望这有帮助。