我正在使用map reduce实现左连接功能。左侧有大约6亿条记录,右侧有大约2300万条记录。在mapper中,我使用左连接条件中使用的列来创建键,并将mapper的键值输出传递给reducer。 我遇到了性能问题,因为几个映射键都很少,两个表中的值都很高(例如分别为456789和78960)。即使其他减速机完成了它们的工作,这些减速机也能继续运行更长的时间。 有多种方法可以使多个Reducer并行处理mapper的相同键值输出,从而提高性能?
这是我想要优化的Hive查询。
select distinct
a.sequence,
a.fr_nbr,
b.to_nbr,
a.fr_radius,
a.fr_zip,
a.latitude as fr_latitude,
a.longitude as fr_longitude,
a.to_zip,
b.latitude as to_latitude,
b.longitude as to_longitude,
((2 * asin( sqrt( cos(radians(a.latitude)) * cos(radians(b.latitude)) * pow(sin(radians((a.longitude - b.longitude)/2)), 2) + pow(sin(radians((a.latitude - b.latitude)/2)), 2) ) )) * 6371 * 0.621371) as distance,
a.load_year,
a.load_month
from common.sb_p1 a LEFT JOIN common.sb__temp0u b
on a.to_zip=b.zip
and a.load_year=b.load_year
and a.load_month=b.load_month
where b.correction = 0
and a.fr_nbr <> b.to_nbr
and ((2 * asin( sqrt( cos(radians(a.latitude)) * cos(radians(b.latitude)) * pow(sin(radians((a.longitude - b.longitude)/2)), 2) + pow(sin(radians((a.latitude - b.latitude)/2)), 2) ) )) * 6371 * 0.621371 <= a.fr_radius)
任何其他解决方案也将受到赞赏。
答案 0 :(得分:1)
使用UNION ALL
:
select * from table1 a left join table2 b on a.key=b.key
where a.key not in (456789,78960)
union all
select * from table1 a left join table2 b on a.key=b.key
where a.key = 456789
union all
select * from table1 a left join table2 b on a.key=b.key
where a.key = 78960
;
这些子查询将并行运行,倾斜的键不会分发到单个reducer
答案 1 :(得分:0)
您也可以考虑使用HiveQL。它几乎适用于上面提到的那种情况,并且可以处理map reduce实现的复杂性。