我想将以下 SQL 请求转换为 PIG 脚本。
我的问题是,我目前在脚本中使用了许多 JOIN
,这似乎使 PIG 运行缓慢。
如何优化代码?
SQL 请求:
Select distinct
A.somethingA1, A.somethingA2, A.somethingA3,
B.somethingB1, B.somethingB2, B.somethingB3,
C.somethingC1, C.somethingC2,
D.getFieldX as fieldX,
F.somethingF1
From
TABLE_A A,
TABLE_B B,
TABLE_C C,
TABLE_D D,
TABLE_E E,
TABLE_F F
Where
A.getField1 = B.getField1
And A.getField2 = E.getField2
And A.getField3 = C.getField3
And A.getField3 = D.getField4
And A.getField5 = F.getField6
And F.getField7 = D.getField7
And D.getFieldX = 'X'
我是否需要一一使用多个JOIN
,即使这可能会创建一个具有如此多字段的巨大最终对象?或者我可以只使用一个简单的 FILTER
来实现它吗?
实际上,我不确定是否可以对不同表中的数据使用FILTER
。我可以吗?
到目前为止,我在脚本中至少使用了 5 个 JOIN
,但看起来根本没有优化!
这就是我所做的:
A = load 'TABLE_A' using avrostorage();
B = load 'TABLE_B' using avrostorage();
C = load 'TABLE_C' using avrostorage();
D = load 'TABLE_D' using avrostorage();
E = load 'TABLE_E' using avrostorage();
F = load 'TABLE_F' using avrostorage();
data1 = JOIN A by getField1, B by getField1;
data1 = FOREACH data GENERATE A::somethingA1, A::somethingA2, A::somethingA3, A::getField2, A::getField3, B::somethingB1, B::somethingB2, B::somethingB3;
data2 = JOIN data1 by getField2, E by getField2;
data2 = FOREACH data2 GENERATE data1::A::somethingA1, data1::A::somethingA2, data1::A::somethingA3, data1::A::getField2, data1::A::getField3, data1::B::somethingB1, data1::B::somethingB2, data1::B::somethingB3;
dump data2;
describe data2;
等等等等......直到进入决赛 table 。
谢谢。
最佳答案
您的脚本将被翻译成许多 MapReduce 作业,如连接数量或更多,这就是 Hadoop 的瓶颈!
尽快修剪列固然好,但减少 MR 作业数量更重要。尝试使用多重联接一步完成它可能会减少 MR 作业:
data1 = JOIN A by getField1, B by getField1, C by getField1 -- ...;
data2 = FOREACH data1 GENERATE A::somethingA1, A::somethingA2, --..;
如果您的关系较小,请考虑使用 replicated关键词。
关于mysql - 如何将简单的 SQL 请求转换为 Apache PIG 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41426320/