如何在PIG中使用FILTER获取for循环内的匹配值?

时间:2015-06-22 09:06:17

标签: hadoop apache-pig

将此视为我的输入,

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循环中执行此操作?请告诉我。提前谢谢!

1 个答案:

答案 0 :(得分:1)

Apache Pig中没有for循环,如果为了某些特定目的需要迭代数据的每一行,则需要实现自己的UDF。 foreach关键字不用于创建循环,它用于根据列转换数据,并将UDF应用于它。您还可以使用嵌套的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 numberdata1 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))