如何处理 Databricks 中不同数据类型的合并模式选项?
Posted
技术标签:
【中文标题】如何处理 Databricks 中不同数据类型的合并模式选项?【英文标题】:How to handle mergeschema option for differing datatypes in Databricks? 【发布时间】:2022-01-20 02:12:48 【问题描述】:import spark.implicits._
val data = Seq(("James","Sales",34))
val df1 = data.toDF("name","dept","age")
df1.printSchema()
df1.write.option("mergeSchema", "true").format("delta").save("/location")
val data2 = Seq(("Tiger","Sales","34") )
var df2 = data2.toDF("name","dept","age")
df2.printSchema()
df2.write.option("mergeSchema", "true").format("delta").save("/location")
df2.show(false)
当我们编写 df2 数据帧时,它失败了,因为在 delta 表中,age 是 IntergerType,而第二个 df2 age 是 StringType。我们如何处理这种情况,以便代码顺利处理这种情况。
【问题讨论】:
无论您需要追加数据还是覆盖数据,您都必须提供模式。您还需要将 OverwriteSchema 选项提供为 True。 查看此链接:medium.com/@amany.m.abdelhalim/… 【参考方案1】:您可以将overwriteSchema
的选项设置为true,这应该可以。
val data = Seq(("James","Sales",34))
val df1 = data.toDF("name","dept","age")
df1.printSchema()
df1.write.option("mergeSchema", "true").format("delta").save("/location")
val data2 = Seq(("Tiger","Sales","34") )
var df2 = data2.toDF("name","dept","age")
df2.printSchema()
df2.write.option("overwriteSchema", "true").mode("overwrite").format("delta").save("/location")
【讨论】:
如果我将模式设置为“覆盖”,现有数据不会被覆盖吗?我不希望现有数据被覆盖。 在这种情况下,您可以将模式用作附加 我确实尝试过。它给出了以下“AnalysisException:无法合并字段'age'和'age'。无法合并不兼容的数据类型IntegerType和StringType”以上是关于如何处理 Databricks 中不同数据类型的合并模式选项?的主要内容,如果未能解决你的问题,请参考以下文章