我有一个数据框,其ID为:String列,Type:Int列和Name:String列。
此数据框在“名称”列中有很多缺失值。
但我还有另外三个包含ID列和Name列的数据帧。
我想要做的是使用其他值填充第一个Dataframe中的缺失值。其他数据帧不包含属于第一个数据帧的所有ID,而且它们还可以包含第一个数据帧中不存在的ID。
在这种情况下,正确的方法是什么?我知道我可以结合两个DF,如:
df1.join(df2, df1("ID")===df2("ID"), "left_outer")
但是因为我知道第一个数据帧中type = 2的所有条目都有一个名称,所以我想仅限于这个类型为= 1的行
任何想法如何从三个DF中检索名称值以填充原始数据框中的“名称”列?
答案 0 :(得分:4)
您可以拆分,join
感兴趣的子集并收集所有内容:
df1
// Select ones that may require filling
.where($"type" === 1)
// Join
.join(df2, Seq("ID"), "left_outer")
// Replace NULL if needed
.select($"ID", $"Type", coalesce(df1("Name"), df2("Name")).alias("Name"))
// Union with subset which doesn't require filling
.union(df1.where($"type" === 2)) // Or =!= 1 as suggested by @AlbertoBonsanto
如果type
列为nullable
,则应使用union($"type".isNull)
单独涵盖此方案。