Apache pig 清除清管器中的重复对

Apache pig 清除清管器中的重复对,apache-pig,Apache Pig,我有下面的样品 更新: OBR|1|METABOLIC PANEL OBX|1|Glucose OBX|2|BUN OBX|3|CREATININE OBR|2|RFLX TO VERIFICATION OBX|1|EGFR OBX|2|SODIUM OBR|3|AMBIGUOUS DEFAULT OBX|1|POTASSIUM OBR|1|METABOLIC PANEL|OBR_filename_1 OBX|1|Glucose|OBR_filename_1 OBX|2|BUN|OBR_fil

我有下面的样品

更新:

OBR|1|METABOLIC PANEL
OBX|1|Glucose
OBX|2|BUN
OBX|3|CREATININE
OBR|2|RFLX TO VERIFICATION
OBX|1|EGFR
OBX|2|SODIUM
OBR|3|AMBIGUOUS DEFAULT
OBX|1|POTASSIUM
OBR|1|METABOLIC PANEL|OBR_filename_1
OBX|1|Glucose|OBR_filename_1
OBX|2|BUN|OBR_filename_1
OBX|3|CREATININE|OBR_filename_1
OBR|2|RFLX TO VERIFICATION|OBR_filename_2
OBX|1|EGFR|OBR_filename_2
OBX|2|SODIUM|OBR_filename_2
OBR|3|AMBIGUOUS DEFAULT|OBR_filename_3
OBX|1|POTASSIUM|OBR_filename_3

在这个样本中,将所有<强> OBR 作为一个测试,并且每个<强> OBR 都遵循<强> OBX,这是<强> OBR的结果。每个OBR后面跟着id(如本例中的1、2和3)。特定OBR的所有OBX都以1开头。因此,我的想法是,如果我找到一个OBR,我将创建一个唯一的id,并将其放入所有OBX,然后是OBR,直到我再次到达id为2的OBR,我也会这样做。 下面是我的预期输出

预期结果:

OBR|1|METABOLIC PANEL
OBX|1|Glucose
OBX|2|BUN
OBX|3|CREATININE
OBR|2|RFLX TO VERIFICATION
OBX|1|EGFR
OBX|2|SODIUM
OBR|3|AMBIGUOUS DEFAULT
OBX|1|POTASSIUM
OBR|1|METABOLIC PANEL|OBR_filename_1
OBX|1|Glucose|OBR_filename_1
OBX|2|BUN|OBR_filename_1
OBX|3|CREATININE|OBR_filename_1
OBR|2|RFLX TO VERIFICATION|OBR_filename_2
OBX|1|EGFR|OBR_filename_2
OBX|2|SODIUM|OBR_filename_2
OBR|3|AMBIGUOUS DEFAULT|OBR_filename_3
OBX|1|POTASSIUM|OBR_filename_3
使用。假设您与重复记录有关系A。下面的语句将删除重复记录并将唯一记录存储在关系B中

B = DISTINCT A;
使用。假设您与重复记录有关系A。下面的语句将删除重复记录并将唯一记录存储在关系B中

B = DISTINCT A;

我试过这个,它看起来像一个HL文件。你可以使用Stitch,Over&Lead,并想出类似的方法。从性能的角度来看,可能有比这更好的解决方案。但我想这应该行得通,请告诉我进展如何

DEFINE Over org.apache.pig.piggybank.evaluation.Over('long');
DEFINE Stitch org.apache.pig.piggybank.evaluation.Stitch;
DEFINE lead org.apache.pig.piggybank.evaluation.Lead;

in = LOAD 'hl_file' using PigStorage('|') as (id:chararray, num:int, reason:chararray);
temp = rank in;
ranked = foreach temp generate $0 as row_no, $1 as id:chararray, $2 as orig_id:int, $3 as reason:chararray;
OBR_data = FILTER ranked by id == 'OBR';
next_row_num_OBR = FOREACH (group OBR_data by id) {
sorted = ORDER OBR_data by row_no;
stitched = Stitch(sorted, Over(sorted.row_no, 'lead',0,1,1,(long)9999));
generate flatten(group) as (id:chararray), 
flatten(stitched.(row_no, orig_id, reason, result)) as (row_no:long, orig_id:int, reason:chararray, next_row_no:long);
}
OBX_data = FILTER ranked by id == 'OBX';
Crossed = CROSS next_row_num_OBR, OBX_data;
result = FILTER Crossed BY (OBX_data::row_no > next_row_num_OBR::row_no and OBX_data::row_no < next_row_num_OBR::next_row_no);

它不是文件名或常量,而是将OBR记录添加到相应的OBX中。

我尝试过这个,它看起来像HL文件。你可以使用Stitch,Over&Lead,并想出类似的方法。从性能的角度来看,可能有比这更好的解决方案。但我想这应该行得通,请告诉我进展如何

DEFINE Over org.apache.pig.piggybank.evaluation.Over('long');
DEFINE Stitch org.apache.pig.piggybank.evaluation.Stitch;
DEFINE lead org.apache.pig.piggybank.evaluation.Lead;

in = LOAD 'hl_file' using PigStorage('|') as (id:chararray, num:int, reason:chararray);
temp = rank in;
ranked = foreach temp generate $0 as row_no, $1 as id:chararray, $2 as orig_id:int, $3 as reason:chararray;
OBR_data = FILTER ranked by id == 'OBR';
next_row_num_OBR = FOREACH (group OBR_data by id) {
sorted = ORDER OBR_data by row_no;
stitched = Stitch(sorted, Over(sorted.row_no, 'lead',0,1,1,(long)9999));
generate flatten(group) as (id:chararray), 
flatten(stitched.(row_no, orig_id, reason, result)) as (row_no:long, orig_id:int, reason:chararray, next_row_no:long);
}
OBX_data = FILTER ranked by id == 'OBX';
Crossed = CROSS next_row_num_OBR, OBX_data;
result = FILTER Crossed BY (OBX_data::row_no > next_row_num_OBR::row_no and OBX_data::row_no < next_row_num_OBR::next_row_no);

它不是文件名或常量,而是将OBR记录添加到相应的OBX中。

请帮助我,我在这方面做了很多努力。Distinct不起作用?您的预期结果不涉及所有的唯一记录。没有Distinct不起作用。是的,它没有所有的独特记录。我只想要我展示的那些唱片。我如何才能做到这一点。在这种情况下,你无法做到,因为没有区分这些记录的标准。我可以使用UDF来做到这一点吗?请帮助我,我在这方面做了很多努力。Distinct不起作用?你的预期结果不涉及所有的unique记录。no Distinct不起作用。是的,它没有所有的独特记录。我只想要我展示的那些唱片。我如何才能做到这一点。在这种情况下,你不能,因为没有区分这些记录的标准。我可以使用UDF吗?你当然提供了一个很好的方法,但我希望得到我在问题中提到的结果。对于你不同的方法,我真的很感谢你。我对你的答案投了赞成票。请支持我的问题。你当然提供了一个很好的方法,但我希望得到我在问题中提到的结果。对于你不同的方法,我真的很感谢你。我对你的答案投了赞成票。请投票表决我的问题。