oop - Hive - Impala - переписать запрос на производительность - PullRequest
1 голос
/ 05 апреля 2020

У меня есть 2 таблицы с нижними столбцами

Table1

col1   col2   col3     val
11     221    38       10
null   90     null     989
78     90     null     77

table2

col1   col2   col3  
12     221    78
23     null   67 
78     90     null

Я хочу сначала объединить эти 2 таблицы на col1, если значения совпадают, затем остановите, если не соедините на col2, если совпадения остановите, иначе соединитесь на col3 и заполните val, если какой-либо из столбцов будет совпадать, в противном случае пустое значение и какой-либо другой совпадающий столбец, затем заполните этот столбец в столбце matchcol. Таким образом, вывод должен выглядеть следующим образом:

col1   col2   col3     val     matchingcol
11     221    38       10      col2
null   90     null     null    null
78     90     null     77      col1

Я смог сделать это, используя запрос ниже, но производительность очень низкая. Пожалуйста, дайте мне знать, если есть какой-нибудь лучший способ написания ниже для более быстрой производительности

select *
from table1 t1 left join
     table2 t2_1
     on t2_1.col1 = t1.col1 left join
     table2 t2_2
     on t2_2.col2 = t1.col2 and t2_1.col1 
     left join table2 t2_3 on t2_3.col3 = t1.col3 and t2_2.col2 is null

ps: я задавал тот же вопрос раньше, но лучшего ответа не было

1 Ответ

1 голос
/ 05 апреля 2020

Что вы описываете:

select t1.col1, t1.col2, t1.col3, 
       (case when t2_1.col1 is not null or t2_2.col1 is not null or t2_3.col1 is not null then t1.val end) as val
       (case when t2_1.col1 is not null then 'col1'
             when t2_2.col2 is not null then 'col2'
             when t2_3.col3 is not null then 'col3'
        end) as matching
from table1 t1 left join
     table2 t2_1
     on t2_1.col1 = t1.col1 left join
     table2 t2_2
     on t2_2.col2 = t1.col2 and t2_1.col1 is null left join
     table2 t2_3
     on t2_3.col3 = t1.col3 and t2_2.col2 is null;

Это, вероятно, лучший подход.

...