将此视为我的输入,
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循环中执行此操作?请告诉我。提前谢谢!
答案 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
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))