Я реализую функцию левого соединения, используя уменьшение карты. Левая сторона содержит около 600 миллионов записей, а правая - около 23 миллионов записей. В картографе я делаю ключи, используя столбцы, используемые в условии левого соединения, и передаю вывод значения ключа из преобразователя в редуктор. У меня проблемы с производительностью из-за нескольких ключей сопоставления, для которых количество значений в обеих таблицах велико (например, 456789 и 78960 соответственно). Несмотря на то, что другие редукторы завершают свою работу, эти редукторы продолжают работать дольше. Есть ли способ, которым несколько редукторов могут работать с одним и тем же выводом ключевого значения из сопоставителя параллельно для повышения производительности?
Это запрос 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)
Любое другое решение также будет оценено по достоинству.