има ли начин да се оптимизира производителността на тази заявка в Impala?

Тази заявка включва 4 таблици и струва 10,5 часа за изпълнение:

Етап 1:

create table temp partitioned by (date_pull) stored as parquet as
select <fields>
from trans_ext -- this is the base table
inner join [shuffle] ac  -- fact_acc
inner join [shuffle] c  --related_acc
left join dt --trx_type 

статистически данни за броя на редовете за таблиците:

trans_ext: 8,289,244,895 (72 partitions)
ac: 985,164,794 (1 partitions)
c: 17,496,531 (1 partition)
dt 4: 369 (1 partition)

Стъпка 2: Създайте таблица за преброяване h от temp

select related_cust, count(*) as ct from temp group by related_cust;

Стъпка 3: Създайте финална таблица чрез вътрешно присъединяване към таблицата за преброяване и прилагане на клауза where

select t.* 
from temp t
inner join [shuffle] h on h.related_cust=t.related_cust
where  t.related_cust is not null
and h.ct <=1000000
order by t.related_cust;

Мисля си как мога да премахна таблицата за преброяване и директно да създам крайния резултат? размер на финалната маса: 19,6 милиарда реда.

Някаква мисъл? всеки намек е високо оценен.


person mdivk    schedule 10.12.2018    source източник
comment
би било полезно, ако добавите колоните на таблицата за вашите изходни данни и колоните, използвани по време на свързването (ако използвате такива)   -  person hlagos    schedule 11.12.2018


Отговори (1)


Първата ми мисъл е да премахна клаузата order by от последната ви заявка, използвана за създаване на вашата финална таблица. Тази операция е наистина скъпа и освен това не добавя никаква стойност, като се има предвид, че данните няма да се четат последователно, така че не печелите нищо от нея.

Може да има други начини за прилагане на същата заявка, би било полезно, ако можете да обясните проблема, който се опитвате да разрешите, вместо заявката, използвана за решаването му.

person hlagos    schedule 11.12.2018