Прочитать все файлы - f1, f2, f3 и объединить имена столбцов.Затем для каждого файла найдите столбцы дополнения и сгенерируйте новые столбцы с подсветкой (ноль).Наконец, объедините все DFS, выбрав имена столбцов по порядку.Вот решение scala.
val f1 = spark.read.format("csv").option("inferSchema","true").option("header","true").load("in/f1.csv")
val f2 = spark.read.format("csv").option("inferSchema","true").option("header","true").load("in/f2.csv")
val f3 = spark.read.format("csv").option("inferSchema","true").option("header","true").load("in/f3.csv")
val fall = f1.columns.union(f2.columns).union(f3.columns).distinct
val f1c = fall.diff(f1.columns)
val f1a = f1c.foldLeft(f1)( (acc,r) => acc.withColumn(r,lit(null)) )
val f2c = fall.diff(f2.columns)
val f2a = f2c.foldLeft(f2)( (acc,r) => acc.withColumn(r,lit(null)) )
val f3c = fall.diff(f3.columns)
val f3a = f3c.foldLeft(f3)( (acc,r) => acc.withColumn(r,lit(null)) )
val result = f1a.select(fall.head,fall.tail:_*).union(f2a.select(fall.head,fall.tail:_*)).union(f3a.select(fall.head,fall.tail:_*))
result.printSchema
result.show(false)
Результаты:
root
|-- c1: integer (nullable = true)
|-- c2: integer (nullable = true)
|-- c3: integer (nullable = true)
|-- c4: integer (nullable = true)
|-- c5: integer (nullable = true)
|-- c6: integer (nullable = true)
+----+----+----+----+----+----+
|c1 |c2 |c3 |c4 |c5 |c6 |
+----+----+----+----+----+----+
|1 |3 |4 |null|null|null|
|null|null|null|4 |5 |6 |
|7 |8 |null|null|null|null|
+----+----+----+----+----+----+