Apache pig 猪的“::”和“.”之间有什么区别?
Apache pig 猪的“::”和“.”之间有什么区别?,apache-pig,Apache Pig,清管器中的:和之间有什么区别 我什么时候使用一个和另一个 例如,我知道当两个别名中都存在一个字段时,:在join中是必需的: A = foreach (join B by (x), C by (y)) generate B::y as b_y, C::y as c_y; 当访问组字段时,我需要: A = foreach (group B by (x,y)) generate group.x as x, group.y as y, SUM(B?z) as z; 但是,我是否将B::z或B.z传
清管器中的:
和之间有什么区别
我什么时候使用一个和另一个
例如,我知道当两个别名中都存在一个字段时,:
在join
中是必需的:
A = foreach (join B by (x), C by (y)) generate B::y as b_y, C::y as c_y;
当访问组字段时,我需要
:
A = foreach (group B by (x,y)) generate group.x as x, group.y as y, SUM(B?z) as z;
但是,我是否将B::z
或B.z
传递给上面的SUM
,而不是B?z
?IIRC您在一些陈述后会得到:
。除非(正如您所提到的)两个不同的前缀中存在一个名称,否则您不必担心它
的不同之处在于您要进入结构内部。
group.x作为x,group.y作为y
相当于FLATTEN(group)
SUM(B?z)
-在这里,您应该执行SUM(B.z)
,以指定您需要一个特定字段来SUM
在Pig中,::
在可能产生命名冲突的操作之后用作消歧工具。值得注意的是,JOIN
、CROSS
和FLATTEN
会发生这种情况。考虑两个关系,<代码>:{(id:int,名称:字符数组)}< /> >和<代码> b:{(id:int,位置:字符数组)}<代码>。如果要将名称与位置关联,自然要执行以下操作:
C = JOIN A BY id, B BY id;
如果没有消歧操作符,您的模式将是
C:{(id:int, name:chararray, id:int, location:chararray)}
现在,您无法分辨id
所指的字段。为了避免这种情况,Pig将改为
C:{(A::id:int, A::name:chararray, B::id:int, B::location:chararray)}
同样,您可以将两个元组具有同名字段的包展平,它们也会发生冲突。因此,在这种情况下也使用相同的运算符。如果没有此类冲突,则不需要使用全名:name
在这里是明确的。要简化C
,则可以执行以下操作:
D = FOREACH C GENERATE A::id, name, location;
相反,
操作符从包和元组中投影字段。如果您有一个模式为{(x:int,y:int,z:int)}
的包b
,则投影b.y
生成一个只包含指定字段的包:{(y:int)}
。可以用括号一次投影多个字段:b.(y,z)
生成{(y:int,z:int)}
与元组一起使用时,结果是仅包含指定字段的元组。如果元组t
具有模式(x:int,y:int,z:int)
,那么t.x
就是元组(x:int)
,t.(y,z)
就是元组(y:int,z:int)
对于您关于SUM
的特定问题,请注意SUM
以及其他汇总统计自定义项都以包作为其参数。因此,您需要创建一个包,每个元组只包含一个要求和的字段。使用投影操作符,
:B.z展平(组)
创建字段group::x
和group::y
,而不是x
和y
。我想您仍然可以通过“x”或“y”引用它们,除非还有其他“x”和/或“y”。如果不是这样,请告诉我。问题是,在通过几个组
和连接
操作输入别名后,如果使用展平
而不是显式组.x作为x
,例如,没有字段A::x,只有A::B::x
。除非我看到了全貌,否则我不知道:)无论如何,似乎WinnieNicklaus给出了一个非常好的答案。@sds你是对的,如果你使用多个命令来消除歧义,你不能跳过中间名——如果你有A::B::x
,你可以将其称为x
或A::B::x
,但不是A::x
。