Частично обновленная запись - PullRequest
0 голосов
/ 17 марта 2020

У меня есть целевая таблица и несколько таблиц приращений в Hive. Я должен добавить таблицы incrementl к цели и добавить new_id для каждой строки. Если old_id равен, я должен обновить имя, и process_date, но new_id должен быть из предыдущей строки. Не могли бы вы помочь мне?

create table target (
    id           string,
    new_id           string,
    name         string,
    process_date string );


create table increment1 (
    id           string,
    name         string,
    process_date string );

create table increment2 like increment1;

insert into table increment1 values
('1', 'Apple', '2020-03-12'),
('3', 'Kiwi', '2020-03-12');


insert into table increment2 values
('3', 'Avocado', '2020-03-13'),
('4', 'Blackberry', '2020-03-12');

Я пытался добавить с помощью сценария:

with a as (
    select coalesce(i.id, t.id)                     as id,
           coalesce(i.nk, t.new_id)                 as new_id,
           coalesce(i.name, t.name)                 as name,
           coalesce(i.process_date, t.process_date) as process_date
    from target t
             full join (
        select id,
               reflect("java.util.UUID", "randomUUID") as nk,
               name,
               process_date
        from increment1 -- increment2
    ) i on t.id = i.id
)
from a
insert overwrite table target
select *;

После первой вставки я получил следующие данные в цель:

1       89296ec9-cc0f-4f50-a3dc-22cdaa61f707    Apple   2020-03-12
2       5cd1a5f7-7f86-4daa-8b68-1db5a33a14f8    Orange  2020-03-12
3       2513bd6d-1947-4b41-a033-58ec25c78313    Kiwi    2020-03-12

И после второй Я получил следующие данные в target:

1       89296ec9-cc0f-4f50-a3dc-22cdaa61f707    Apple   2020-03-12
2       5cd1a5f7-7f86-4daa-8b68-1db5a33a14f8    Orange  2020-03-12
3       df683397-c02e-4e6f-a09a-ad2d95f6b797    Avocado 2020-03-13
4       854df396-b345-499b-aa9b-6a6b0b84a92f    Blackberry      2020-03-12

И new_id был изменен для строки с id = 3. Как оставить это старым?

3       2513bd6d-1947-4b41-a033-58ec25c78313    Avocado 2020-03-13

1 Ответ

0 голосов
/ 17 марта 2020

Если я правильно понимаю ваше требование, вы пытаетесь обновить / вставить (добавочную нагрузку) на цель. Для этого вы можете использовать оператор merge:

merge into target t
using ( select * from increment1) sub
on sub.id = t.id
when matched then update set t.name = sub.name, t.process_date= sub.process_date
when not matched then insert values (sub.id, sub.name, sub.process_date);

Если вы не пытаетесь это сделать, добавьте больше контекста и ожидаемый результат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...