По сути, нам нужно разбить «имена», объединить разбитые таблицы, а затем сгруппировать по столбцу «id», собирая имена в списке. Вот и мы:
scala> :pa
// Entering paste mode (ctrl-D to finish)
import org.apache.spark.sql.DataFrame
val df1 = Seq((1, Nil), (3, List("alice")), (4, List("bob"))).toDF("id", "names")
val df2 = Seq((1, List("jack")), (2, List("breanna")), (3, Nil)).toDF("id", "names")
val df3 = Seq((1, List("anna")), (3, List("rob", "jerry")), (4, Nil)).toDF("id", "names")
def expl(df: DataFrame) = df.select($"id", explode($"names").as("name"))
val dfUnion = expl(df1).union(expl(df2)).union(expl(df3))
dfUnion.groupBy("id").agg(collect_list($"name").as("names")).select("id", "names").orderBy("id").show
// Exiting paste mode, now interpreting.
+---+-------------------+
| id| names|
+---+-------------------+
| 1| [jack, anna]|
| 2| [breanna]|
| 3|[alice, rob, jerry]|
| 4| [bob]|
+---+-------------------+