Hive: внутреннее соединение для обновления «таблицы a» из «таблицы b», где значения в «таблице b» отличаются от «таблицы a»? создать последний вид (a + b) - PullRequest
1 голос
/ 20 января 2020

У меня есть две таблицы (таблица a и таблица b) в Hive.

Таблица a является таблицей инициализации (полной). Таблица b является дельта-таблицей с последними обновлениями (эта таблица имеет те же столбцы и еще 5 столбцов, включая столбец отметки времени для последних обновлений).

Я хочу создать последнее представление (объединение между полными + delta) из двух таблиц для получения последних обновлений.

1- Первый шаг, который я сделал, - это выбрать строки с максимальным (временная метка) из таблицы b (delta) для последних обновлений

2- Затем я использовал его как подзапрос во внутреннем соединении:

SELECT full.*, delta.* 
FROM table a FULL 
INNER JOIN (SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY timestamp 
            DESC) as rn
            FROM b) delta 
ON f.id = d.id and d.rn = 1

Проблема в том, что мне нужно указать столбцы, которые я хочу использовать в select, и у меня будут дублированные столбцы с разными значения при обновлении таблицы b.

Мне нужно условие, чтобы всегда выбирать столбцы из таблицы a и заменять столбцы в таблице a столбцами в таблице b, если значения в таблице b отличаются от значений в таблице a.

Любые решения, пожалуйста?

Please find the data simple image in the link

1 Ответ

0 голосов
/ 21 января 2020

Похоже, вы ищете функции COALESCE или NVL . В этом случае ваш запрос может выглядеть так:

SELECT
    A.Person_id as Person_id,               -- Person_id is taken from A table
    A.Training_id as Training_id,           -- Training_id is taken from A table
    coalesce(d.Status, A.Status) as Status, -- If Status from Delta table is not null it is taken otherwise Status from A table is taken
    coalesce(d.Name, A.Name) as Name        -- If Name from Delta table is not null it is taken otherwise Name from A table is taken 
FROM A
LEFT JOIN (SELECT                           -- Left outer join to don't filter out records without updates
                B.Status, 
                B.Name, 
                ROW_NUMBER() OVER (PARTITION BY Person_id ORDER BY timestamp DESC) as rn 
            FROM B) d ON (A.Person_id = d.Person_id and d.rn = 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...