Применение преобразований или условий соединения для достижения результата в pyspark или hive - PullRequest
0 голосов
/ 01 августа 2020

Даны две таблицы или фреймы данных. У одного будут наборы данных и соответствующие таблицы. У других будет источник и цель. Мне нужно решение для следующего условия: как только мы найдем ft.dataset = st.source, нам нужно заменить ft.table в st.source и пренебречь оставшимися записями.

Например: Здесь в первом блоке второй таблицы, которая находится от seq_no 1 до 6, у нас есть совпадение в Ab c, поэтому мы заменили на db.table1 и пренебрегли оставшимися записями в этом блоке. Точно так же нам нужно сделать то же самое для каждого блока второй таблицы. Обратите внимание, что Target одинакова во всех строках второй таблицы. Пожалуйста, помогите мне найти возможное решение в pyspark или Hive.

Первая таблица (ft):

Dataset |   Table
_________________
Abc           db.table1
Xyz           db.table2
Def           db.table3

Вторая таблица (st):

Target| seq_no| source
______________________
A             1           A
A             2           B1
A             3           C1
A             4           D1
A             5           Abc
A             6           Xyz
A             1           A
A             2           B1
A             3           C1
A             4           D1
A             5           Def
A             6           Abc
A             7           Xyz

Ожидаемый результат :

Target| seq_no | source
_______________________
A             1           A
A             2           B1
A             3           C1
A             4           D1
A             5           db.table1
A             1           A
A             2           B1
A             3           C1
A             4           D1
A             5           db.table3

1 Ответ

1 голос
/ 01 августа 2020

В Hive вы можете использовать левое соединение для поиска совпадения в первой таблице и окно min() для определения последовательности первого совпадения

select target, seq_no, source
from (
    select 
        st.target, 
        st.seq_no, 
        coalesce(st.source, ft.table) as source,
        min(case when ft.dataset is not null then st.seq_no end) over(partition by st.target) first_matched_seq_no
    from st 
    left join ft on ft.dataset = st.source
) t
where first_matched_seq_no is null or seq_no <= first_matched_seq_no
order by target, seq_no
...