如何在pig中使用filter获得for循环中的匹配值?

9rygscc1  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(327)

把这当作我的意见,

Input (File1):
12345;11
34567;12
.
.

Input (File2):
11;(1,2,3,4,5,6,7,8,9)
12;(9,8,7,6,5,4,3,2,1)
.
.

我想得到如下输出:

Output:
(1,2,3,4,5,6,7,8,9)
(9,8,7,6,5,4,3,2,1)

下面是我尝试使用filter的示例代码,我遇到了一些错误。请给我建议一些其他的选择。

data1 = load '/File1' using PigStorage(';') as (id,number);
data2 = load '/File2' using PigStorage(';') as (numberInfo, collection);

out = foreach data1{
Data_filter = FILTER data2 by (numberInfo matches CONCAT(number,''));
generate Data_filter;
}

有可能在for循环中这样做吗?请告诉我。提前谢谢!

gjmwrych

gjmwrych1#

apachepig中没有for循环,如果您需要为某些特定的目的遍历每一行数据,那么您需要实现自己的udf。这个 foreach 关键字不用于创建循环,而是用于基于列转换数据,并对其应用自定义项。也可以使用嵌套 foreach ,对关系中的每个组执行操作。
但是,您的语法是错误的。您正在尝试使用嵌套的foreach而不首先对数据进行分组。嵌套foreach所做的是在分组关系上执行您在代码块中定义的操作。因此,代码工作的唯一方法是首先对数据进行分组:

data1 = load '/File1' using PigStorage(';') as (id,number);
data2 = load '/File2' using PigStorage(';') as (numberInfo, collection);

data1 = group data1 by id;

out = foreach data1{
    Data_filter = FILTER data2 by (numberInfo matches CONCAT(number,''));
    generate Data_filter;
}

但是,这不起作用,因为在嵌套的 foreach 你不能引用像这样的不同关系 data2 .
你真正想要的是 JOIN 两种关系的运算 number 为了 data1 以及 numberInfo 为了 data2 . 这将为您提供:

joined_data = join data1 by number, data2 by numberInfo;

dump joined_data;
(12345,11,11,(1,2,3,4,5,6,7,8,9))
(34567,12,12,(9,8,7,6,5,4,3,2,1))

在您的问题中,您说过您只希望最后一列作为输出,所以现在可以使用 foreach 要生成所需的列,请执行以下操作:

final_data = foreach joined_data generate data2::collection;

dump final_data;
((1,2,3,4,5,6,7,8,9))
((9,8,7,6,5,4,3,2,1))

相关问题