答 (1,2,3) (4,2,1) (8,3,4) (4,3,3) (7,2,5) (8,4,3)
B: (2,4) (8,9) (1,3) (2,7) (2,9) (4,6) (4,9)
C: (1,{(1,2,3)},{(1,3)}) (4, - {(4,2,1),(4,3,3)},{(4,6),(4,9)}) (8,{(8,3,4),(8,4,3)},{(8,9)})
朋友们, 对于上述文件A,B和C,任何人都可以解释以下声明的结果吗? X =每个C生成平面(A。($ 0,$ 1)),FLATTEN(B. $ 1);
我很难知道扁平化的效果如何。 提前谢谢!
答案 0 :(得分:2)
为了更好地理解,首先要对关系C进行描述并检查其架构。 它应该类似于 -
describe C;
C: {A::group: bytearray, A: {()}, B: {()}}
现在你正在做一个关于C的一个foreach和一个flatten,记得按照拇指规则 - foreach with flatten会生成包中每条记录的叉积,并生成所有其他表达式。
现在让我们考虑关系C中的第一个元组
(1,{(1,2,3)},{(1,3)})
为了更好地理解,我可以将其表示为
(C::1,{A::(1,2,3)},{B::(1,3)})
A.($0,$1) = (1,2)
B.($1) = (3)
对于包中的每个记录,我们每个只有一个术语,因此只有一个交叉产品,因此只有一个元组获得此迭代的输出,即(1,2,3)
现在让我们考虑关系C中的第二个元组,如下图所示A有两个记录,B有两个记录,它们的叉积为2x2 = 4,因此我们将在输出中看到4个记录 -
(C::4,{A::(4,2,1),A::(4,3,3)},{B::(4,6),B::(4,9)})
A.($0,$1) = (4,2) and (4,3)
B.($1) = (6) and (9)
--As output we will see cross product of all of the other expressions in the generate statement, hence we get
(4,2,6) (4,2,9) (4,3,6) (4,3,9)
现在让我们看看关系C中第三个元组会发生什么,这里A有2条记录而B只有1条记录,我们得到2x1 = 2条输出行,(8,3,9)(8,4,9)
您可以查看书中的更多示例" Programming Pig"
希望这有帮助。