如何使用其他数据框中的值填充缺失值

时间:2016-09-24 15:13:28

标签: scala apache-spark join apache-spark-sql

我有一个数据框,其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中检索名称值以填充原始数据框中的“名称”列?

1 个答案:

答案 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)单独涵盖此方案。