mysql - 如何将简单的 SQL 请求转换为 Apache PIG 脚本?

标签 mysql sql oracle join apache-pig

我想将以下 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/

相关文章:

php - 使用规范化会导致 mysql 查询错误

mysql - SQL错误-int与日期不兼容

php - 根据需要在 PHP 和 MySQL 中添加更多 AND 运算符

MySQL GROUP BY 每个逗号分隔值

java - 使用 JDBC 连接到数据库服务器的简单 Java 程序的执行时间随处变化

mysql - Laravel 中的批量更新

mysql - 表中是否可以有切换 UNIQUE 索引?

sql - MySQL查看: How do I set default value of a calculated field to 0?

c# - 无法加载文件或程序集 'Oracle.Web, Version=2.112.1.0... The system cannot find the file specified. (It' 已加载到我的 GAC 中)

sql - Oracle OCI C 代码中的错误 OCI_INVALID_HANDLE