У меня есть запрос с использованием псевдонимов таблиц в SparkSQL 2.4
, где основная таблица («product») присоединяется к другой таблице («alias_tbl») дважды , но с другими псевдонимами -
create temporary view product as
select
prod_id, prod2_id
from product;
create temporary view alias_tbl as
select
prod_id, store_name
from store
group by 1, 2;
create temporary view final_vw as
select p.prod_id,
t1.store_name as name1,
t2.store_name as name2
from product p
left join alias_tbl t1
p.prod_id = t1.prod_id
left join alias_tbl t2
on p.prod_id2 = t2.prod_id;
Как показано выше, alias_tbl
дедуплицируется только один раз, прежде чем он впоследствии будет дважды объединен с таблицей «product» через псевдонимы.
Представление DAG
в Spark UI
показывает соединения (с alias_tbl
) как 2
отдельные ветви. Однако показано, что дедупликация (HashAggregate
, вызванная Group By
) происходит дважды - один раз для каждой из этих 2
ветвей сглаживания. Я также заметил, что было 2 Shuffles
(Exchange
) на основе того же ключа т.е. alias_tbl.prod_id
на каждой из веток перед окончательным соединением.
Мой вопрос - Поскольку в приведенных выше запросах Group By
в alias_tbl
встречается только один раз (перед последним объединением в Query-3), почему агрегация происходит в обеих ветвях). Я ожидал, что, поскольку дедупликация alias_tbl происходит только один раз перед объединениями, Spark выполнит это (агрегирование и обмен) только ONCE (вместо двух) перед объединениями и будет повторно использовать это в обе ветви.
Может кто-нибудь объяснить, почему есть 2 агрегирования (и перемешивание) на обеих ветвях псевдонимов, а не только 1
, поскольку это одна и та же таблица (с использованием псевдонимов)? Есть ли способ переписать этот запрос так, чтобы HashAggregation
и Shuffle
появлялись только один раз (перед окончательным соединением и ускорением запроса? Я использую SparkSQL (2.4)
.
Пожалуйста дайте мне знать, если потребуется дополнительная информация. Любая помощь приветствуется. Спасибо.