我正在尝试(内部)连接hdfs上按“day”(日期)分区的两个表,并持续了多天(比如2周)。两个表都有100个列,但我只想查询其中的10个。每天有超过十亿行。
我的配置单元查询如下所示。
INSERT OVERWRITE TABLE join1 partition (day)
SELECT a.x1, a.x2, a.x3... a.xn, b.y1, b.y2.... b.ym, b.day
from (
select x1, x2, x3... xn
from table1
where day between day1 and day2
) a
join (
select x1, y1, y2,... ym, day
from table2 where day between day1 and day2
) b
on a.x1=b.x1;
第一个问题-这需要一个真正的长时间(12+小时)这样做,即使在较小的时间(1-7天)加入。
第二个问题-每次我试着做超过10天左右都会失败。它使用大约504个Map器和250个还原器,这是默认值(我也尝试过500个还原器)。
我知道这个错误不是真的(hive是什么:从org.apache.hadoop.hive.ql.exec.mapredtask返回代码2),但是即使是真正的错误也不是很有用(很抱歉,我现在不能得到它)。
这次撞车的原因是什么?有谁能建议一个更好的方法加入这么大的表?
2条答案
按热度按时间j5fpnvbx1#
关于错误:
既然您在join1上使用动态分区,那么您是否正确设置了可以创建的最大分区数?
关于速度:
你的表1和表2是这样定义的吗?
这个表是按天分区的,因此访问任何一天都只需要访问相应的分区,而不需要访问整个文件。这将加速你的内部查询。它还使用bucketing,因此当您在x1上执行连接时,所有具有相同x1值的行都被粘贴在同一个位置,这将加快您的连接速度,不要介意这样大的增量。只有在Map阶段进行连接(由于bucketing),差异才可见。
ryoqjall2#
这太长了,不能发表评论。
一些数据库在优化子查询时出现问题。我可以想象这是Hive的问题。因此,我建议:
我还想知道你是否想要一个条件
a.day = b.day
在on
条款。在连接中使用现有的分区键应该有助于提高性能。