sql—在pyspark或hive中应用转换或连接条件以实现结果

kkih6yb8  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(510)

给定两个表或Dataframe。其中一个将拥有数据集和相应的表。另一个将有源和目标。我需要解决以下问题:一旦找到ft.dataset=st.source,就需要替换st.source中的ft.table并忽略剩余的记录。
例如:在第二个表的第一个块中,即从序号1到6,我们在处有一个匹配项,因此我们用db.table1替换,而忽略了该块中剩余的记录。同样地,我们需要对第二个表的每个块执行相同的操作。注意,目标在第二个表的所有行中都是相同的。请帮我在Pypark或hive中找到一个可能的解决方案。
第一张table(英尺):

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

第二张table(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
gz5pxeao

gz5pxeao1#

在配置单元中,可以使用左联接在第一个表和窗口中搜索匹配项 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

相关问题