如何将一个简单的sql请求转换成apachepig脚本?

vwkv1x7d  于 2021-06-21  发布在  Pig
关注(0)|答案(1)|浏览(328)

我想把下面的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。
谢谢您。

cpjpxq1n

cpjpxq1n1#

您的脚本将被翻译成许多mapreduce作业,作为连接数或更多,这是hadoop的瓶颈!
尽快删减专栏固然好,但减少乔布斯的数量更为重要。尝试一步一步地使用多个连接,这样可能会减少mr jobs:

data1 = JOIN A by getField1, B by getField1, C by getField1 -- ...;
data2 = FOREACH data1 GENERATE A::somethingA1, A::somethingA2, --..;

如果你有一个小的关系,考虑使用复制关键字。

相关问题