gpt4 book ai didi

apache-pig - pig 的 `::`和 `.`有什么区别?

转载 作者:行者123 更新时间:2023-12-01 10:50:59 27 4
gpt4 key购买 nike

::.pig 中有什么区别?

我什么时候使用一个与另一个?

例如,我知道当两个别名中都存在一个字段时,::join 中所需要的:

A = foreach (join B by (x), C by (y)) generate B::y as b_y, C::y as c_y;

访问 group 字段时,我需要 .:

A = foreach (group B by (x,y)) generate group.x as x, group.y as y, SUM(B?z) as z;

但是,我是否将 B::zB.z 传递给上面的 SUM 而不是 B?z

最佳答案

在 Pig 中,:: 在可能产生命名冲突的操作之后用作消歧工具。值得注意的是,这发生在 JOINCROSSFLATTEN 中。考虑两个关系,A:{(id:int, name:chararray)}B:{(id:int, location:chararray)}。如果您想将名称与位置相关联,您自然会这样做:

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)}

同样,您可以FLATTEN 两个元组具有同名字段的包,它们也会发生碰撞。所以在这种情况下也使用相同的运算符。当没有冲突时,可以不用全名: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 与其他汇总统计 UDF 一起,将一个包作为其参数。因此,您需要创建一个包,每个元组仅包含一个要求和的字段。使用投影运算符,:B.z

关于apache-pig - pig 的 `::`和 `.`有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20501975/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com