我的输入数据将采用以下格式。
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 中,仅应保留第 4 名。在记录 7 和 8 中,应该只保留 7 个。最后两列实际上是日期列(生效日期和到期日期)。1,2 和 3 之类的重复项可能会出现多次(例如 1,2,3,4 和 5 可能具有相同的值),或者根本没有重复项。
我想到了两种方法,但不确定如何为其中任何一种编码。
所以我正在考虑生成一个 keychange 列(1 或 0),将所有欺骗的值从 1 更改为 0,并且当键(col1、col2、col3 的组合)发生变化时,应该设置这个 keychange 列的值到 1. 然后我可以过滤这个列。但是为此我需要编写一个 UDF(或者是否有任何具有类似功能的 UDF 可用?),因为这需要在传递给 udf 时输入按排序顺序,是否可以将排序数据传递给 udf?如果是这样,如何?这应该是什么样的UDF?或者即使我写了一个mapreduce代码,我应该如何继续,我应该在mapper中发出记录并在reducer中进行所有排序和生成列?请让我知道您的输入(mapreduce 编程的新手,因此您的想法将对我的学习有很大帮助,谢谢!)。
当我浏览“over”函数文档时,它只比较以前的记录和当前记录的同一列,如果我可以在基于 col4 排序后将当前记录的 col5(到期日期)与下一个记录的 col4(生效日期)进行比较(生效日期)按升序排列,我可以对 Col1、col2 和 Col3 进行分组,并消除那些生效日期与之前记录的到期日期相同的记录。但不确定如何使用 over 函数比较两个不同的列。请让我知道您对此的看法。
请让我知道是否有另一种更好的方法来解决这个问题。感谢您的时间!