Apache pig 在pig中投影嵌套关系的所有列
我有一个关系MY_REL,它是X和Y连接的结果:Apache pig 在pig中投影嵌套关系的所有列,apache-pig,Apache Pig,我有一个关系MY_REL,它是X和Y连接的结果: MY_REL = {X::x1,X::x2,Y::y1,Y::y2} 我试着去做 Bla = foreach MY_REL generate X; 猪呕吐: ERROR 1000: Error during parsing. Scalars can be only used with projections 我尝试了X::*但它抛出:无效别名X 丑陋的解决方法:我改为显式编写所有列名: Bla = foreach M
MY_REL = {X::x1,X::x2,Y::y1,Y::y2}
我试着去做
Bla = foreach MY_REL generate X;
猪呕吐:
ERROR 1000: Error during parsing. Scalars can be only used with projections
我尝试了X::*但它抛出:无效别名X
丑陋的解决方法:我改为显式编写所有列名:
Bla = foreach MY_REL generate X::x1, X::x2;
是否有一种生成所有X列的好方法 不要使用
JOIN
,而是使用COGROUP
将创建一个类似于{X:{x1,x2},Y:{y1,y2}}
的关系。因此,您可以:
foreach MY_REL GENERATE FLATTEN(X);
请注意,它是一个袋子,因此您希望将其展平。使用而不是使用
连接
COGROUP
将创建一个类似于{X:{x1,x2},Y:{y1,y2}}
的关系。因此,您可以:
foreach MY_REL GENERATE FLATTEN(X);
请注意,其中是一个包,因此您希望将其展平。如果联接之前的列都有不同的名称,您可以稍后使用它们:
Bla = foreach MY_REL generate x1 + y1, x2 + y2;
如果只有一个冲突,则需要使用原始前缀关系
Bla = foreach MY_REL generate x1, x2, y1, Y:y1 AS y2;
一个新的猪养殖场
在中也有一些讨论,如果您在加入之前的专栏都有不同的名称,您可以稍后使用它们:
Bla = foreach MY_REL generate x1 + y1, x2 + y2;
如果只有一个冲突,则需要使用原始前缀关系
Bla = foreach MY_REL generate x1, x2, y1, Y:y1 AS y2;
一个新的猪养殖场
在ok中也有一些讨论-不需要使用关系名称完全限定列,但我仍然必须显式地命名所有列,对吗?如果使用范围运算符“..”(出现在Pig 0.9中),则不需要,但如果不是,则需要在生成中命名所有要保留以供以后使用的列。我个人要么选择没有冲突的名称,要么在我的下一个FOREACH中重命名所有列。好吧-不需要使用关系名称完全限定列,但我仍然必须显式地命名所有列,对吗?如果使用范围运算符“..”(出现在Pig 0.9中),则不需要,但如果不是“是”,则需要在“生成所有要保留以供以后使用的列”中命名。我个人要么选择没有冲突的名称,要么在下一个FOREACH.creative think中重命名所有列!然而,创建这个关系的是一个左连接,所以我想它不能被一个COGROUP替换,对吗?如果你在
过滤器之后,在X
的大小大于0的地方进行过滤,你可以用COGROUP
替换它。对新手的进一步解释:当PIG执行任何连接
/COGROUP
时,它会使用JOIN key=gaga对文件a和文件B中的所有行进行映射减少分组。它不介意文件A中有2行,文件B中有3行,文件A中有0行,文件B中有0行。这就是SQL人员所说的“完全外部联接”。如果我们请求一个COGROUP
,我们就完成了。如果我们要求加入
,PIG会慷慨地过滤掉其中一个文件有0行的组。创造性思维!然而,创建这个关系的是一个左连接,所以我想它不能被一个COGROUP替换,对吗?如果你在过滤器之后,在X
的大小大于0的地方进行过滤,你可以用COGROUP
替换它。对新手的进一步解释:当PIG执行任何连接
/COGROUP
时,它会使用JOIN key=gaga对文件a和文件B中的所有行进行映射减少分组。它不介意文件A中有2行,文件B中有3行,文件A中有0行,文件B中有0行。这就是SQL人员所说的“完全外部联接”。如果我们请求一个COGROUP
,我们就完成了。如果我们请求一个连接
,PIG会慷慨地过滤掉其中一个文件有0行的组。