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