如何根据 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)
)
)
假设我有两个具有相似模式的不同数据帧:
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)
)
)