应用转换或连接条件以在 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 中将 Python Dict 转换为稀疏 RDD 或 DF
对从 Quickbase 解析的列应用日期时间操作,以在 pyspark 数据块中获取正确的日期时间格式
使用 PySpark 和数据框转换 JSON 以在根下具有数组元素