我有一个数据帧ID:String列,Type:Int列和Name:String列。
这个数据框的Name列有很多缺失的值。
但是我还有另外三个包含ID列和Name列的数据框。
我想做的是用其他数据框的值填充第一个数据框中的缺失值。其他数据帧不包含属于第一个数据帧的所有id,而且它们还可以包含第一个数据帧中不存在的id。
在这种情况下,什么是正确的方法?我知道我可以组合两个df,如:
df1.join(df2, df1("ID")===df2("ID"), "left_outer")
但是因为我知道第一个数据框中type=2的所有条目都已经有名字了,所以我想只对type=1的行限制这个连接
是否知道如何从三个df中检索Names值以填充原始数据框中的Name列?
您可以拆分,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)
分开覆盖。