所以我想把两只Pig的关系连接起来。
RELATION1 = LOAD '$path' USING AvroStorage();
RELATION2 = LOAD '$path' USING AvroStorage();
RELATION3 = JOIN RELATION1 BY field, JOIN RELATION2 BY field;
STORE RELATION3 INTO '$PATH' USING AvroStorage();
但我得到以下错误:
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
Caused by: java.lang.reflect.InvocationTargetException
Caused by: java.lang.OutOfMemoryError: Java heap space
好像是在抱怨堆空间不够。在我的例子中,relation1相对较大,例如~1000gb,relation2较小。只需在pig脚本中加载relation1并进行筛选就可以了。有人能建议我如何解决这个问题吗?谢谢!
1条答案
按热度按时间pjngdqdw1#
既然您提到您的一个关系比另一个小得多,那么您可能需要优化pig脚本。具体地说,如果一个关系比另一个小,那么应该先使用较小的关系,以便更有效地执行联接(请参阅此处的更多内容):
如果其中一个关系非常小,可以放入内存,那么可以执行复制连接(请参阅此处的更多内容)。请注意,顺序与上述相反:
此外,您可以使用
FOREACH
语句只选择所需的变量,这样就可以移动较少的数据。另外,在连接之前进行任何过滤。如果这些修改仍然导致java内存错误,可以更改mapreduce设置。例如,另一个堆栈溢出答案建议
(通过使用不同的推荐设置搜索错误,您还可以尝试其他许多问题/答案。)