pig生成一个键更改列-比较前一个记录和当前记录,但列不同

tag5nh1u  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(323)

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

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函数比较两个不同的列。请让我知道你对这件事的看法。
请告诉我是否有其他更好的方法来解决这个问题。谢谢你的时间!

jhkqcmku

jhkqcmku1#

假设-输入是一个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;

希望这有帮助。

相关问题