【问题标题】:How to drop duplicate columns based on another schema in spark scala?如何在 spark scala 中基于另一个模式删除重复的列?
【发布时间】:2022-01-25 14:00:42
【问题描述】:

假设我有两个具有相似架构的不同数据框:

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)

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

提前谢谢你。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-03-08
      • 1970-01-01
      • 2018-05-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 2021-06-19
      相关资源
      最近更新 更多