如何根据 spark scala 中的另一个模式删除重复的列?

How to drop duplicate columns based on another schema in spark scala?

假设我有两个具有相似模式的不同数据帧:

df0.printSchema
root
 |-- single: integer (nullable = false)
 |-- double: integer (nullable = false)

和:

df1.printSchema
root
 |-- newColumn: integer (nullable = false)
 |-- single: integer (nullable = false)
 |-- double: double (nullable = false)

现在我合并这两个模式,如下所示,并使用这个合并的模式创建一个新的数据框:

val consolidatedSchema = df0.schema.++:(df1.schema).toSet

val uniqueConsolidatedSchemas = StructType(consolidatedSchema.toSeq)

val emptyDF = spark.createDataFrame(spark.sparkContext.emptyRDD[Row], uniqueConsolidatedSchemas)

emptyDF.printSchema
root
 |-- newColumn: integer (nullable = false)
 |-- single: integer (nullable = false)
 |-- double: integer (nullable = false)
 |-- double: double (nullable = false)

但是如您所见,我有两个名称为 double 的字段,但数据类型不同。 如何保留其数据类型与 df0 架构中的匹配的一个并删除另一个?

我希望最终的架构是这样的:

finalDF.printSchema
root
 |-- newColumn: integer (nullable = false)
 |-- single: integer (nullable = false)
 |-- double: integer (nullable = false)

如果您建议任何其他方法来合并这两个模式并达到我的目标,我将不胜感激。

提前致谢。

您可以过滤第二个架构以排除第一个架构中已存在的字段,然后再连接列表:

val uniqueConsolidatedSchemas = StructType(
  df0.schema ++ df1.schema.filter(c1 =>
    !df0.schema.exists(c0 => c0.name == c1.name)
  )
)