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

Posted

技术标签:

【中文标题】应用转换或连接条件以在 pyspark 或 hive 中实现结果【英文标题】:Applying transformations or joining conditions to achieve the result in pyspark or hive 【发布时间】:2020-08-01 09:09:19 【问题描述】:

给定两个表或数据框。一个将拥有数据集和相应的表格。其他将有源和目标。 我需要针对以下情况的解决方案: 一旦找到 ft.dataset = st.source,我们需要替换 st.source 中的 ft.table 并忽略剩余的记录。

例如:在第二个表的第一个块中,从 seq_no 1 到 6,我们在 Abc 处有一个匹配项,所以我们替换为 db.table1 并忽略该块中的剩余记录。同样,我们需要对第二个表的每个块做同样的事情。 请注意,目标在第二个表的所有行中都是相同的。 请帮助我在 pyspark 或 Hive 中找到可能的解决方案。

第一张桌子(英尺):

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

第二张桌子:

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】:

在 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

【讨论】:

感谢您的回答。但它没有按预期工作。它总是在输出中将 seq_no 作为一,甚至不替换 st.它给出了 seq_no 为 1 且不考虑剩余记录的输出。 目标|序列号 |来源 _______________________ A 1 A A 1 A 我提到了您的查询附带的输出。这不是预期的。您能否更新查询并发送。请查看我在问题中提到的预期输出。

以上是关于应用转换或连接条件以在 pyspark 或 hive 中实现结果的主要内容,如果未能解决你的问题,请参考以下文章

PySpark 条件增量

在 PySpark 中将 Python Dict 转换为稀疏 RDD 或 DF

对从 Quickbase 解析的列应用日期时间操作,以在 pyspark 数据块中获取正确的日期时间格式

使用 PySpark 和数据框转换 JSON 以在根下具有数组元素

如何使方法 JSON 可序列化以在自定义 Pyspark 转换器中使用

从 Scala 将 UDF 注册到 SqlContext 以在 PySpark 中使用