把这当作我的意见,
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条答案
按热度按时间gjmwrych1#
apachepig中没有for循环,如果您需要为某些特定的目的遍历每一行数据,那么您需要实现自己的udf。这个
foreach
关键字不用于创建循环,而是用于基于列转换数据,并对其应用自定义项。也可以使用嵌套foreach
,对关系中的每个组执行操作。但是,您的语法是错误的。您正在尝试使用嵌套的foreach而不首先对数据进行分组。嵌套foreach所做的是在分组关系上执行您在代码块中定义的操作。因此,代码工作的唯一方法是首先对数据进行分组:
但是,这不起作用,因为在嵌套的
foreach
你不能引用像这样的不同关系data2
.你真正想要的是
JOIN
两种关系的运算number
为了data1
以及numberInfo
为了data2
. 这将为您提供:在您的问题中,您说过您只希望最后一列作为输出,所以现在可以使用
foreach
要生成所需的列,请执行以下操作: