Я хочу извлечь некоторые столбцы в таблице A, у которых нет записи в таблице B. Как мне добиться этого в Hive? - PullRequest
0 голосов
/ 30 октября 2019

Я хочу извлечь некоторые столбцы в таблице (A), которые не имеют записи в таблице (B). Как я могу добиться этого в Улей? Я работаю над запросом (ниже), но в данный момент он не работает.

Ответы [ 3 ]

0 голосов
/ 30 октября 2019

Здесь на ум приходит left join антипаттерн:

select o.*
from prd_raw_sf.sf_opportunity_dn o
left prd_raw_sf.join sf_si_accounts_mapping m on o.account_name = m.sfdc_account_name
where m.sfdc_account_name is null

Запрос пытается join каждая запись в sf_opportunity_dn с sf_si_accounts_mapping, затем предложение where фильтрует только записичто не может быть соединено.

При следующих индексах это должно быть эффективным решением:

prd_raw_sf.sf_opportunity_dn(account_name )
prd_raw_sf.join sf_si_accounts_mapping(sfdc_account_name)

Примечание: псевдонимы таблиц делают запрос короче и прощепонимать. Я добавил их в ваш запрос, и я бы порекомендовал вам использовать их всегда.

0 голосов
/ 31 октября 2019

Вы можете использовать Left join и Left semi join

Подход с левым соединением:

select a.*
FROM prd_raw_sf.sf_opportunity_dn  as a
LEFT JOIN prd_raw_sf.sf_si_accounts_mapping as b 
      ON a.account_name = b.sfdc_account_name
WHERE b.sfdc_account_name is Null;

Слева с левым соединением:

select a.*
    FROM prd_raw_sf.sf_opportunity_dn  as a
    LEFT SEMI JOIN prd_raw_sf.sf_si_accounts_mapping as b 
          ON a.account_name = b.sfdc_account_name

Мудрость исполнения с левым полусоединениемлучше по сравнению с левым соединением, потому что он проверяет только, как только первая найденная запись найдена во второй таблице, и пропускает оставшиеся совпадения для определенных ключей

0 голосов
/ 30 октября 2019

Я рекомендую использовать not exists. A join не кажется необходимым:

select o.*
from prd_raw_sf.sf_opportunity_dn o 
where not exists (select 1
                  from prd_raw_sf.sf_si_accounts_mapping a
                  where o.account_name = a.account_name
                 );
...