如何处理 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 中不同数据类型的合并模式选项?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理不同类型用户表的主键?

Coalesce 函数如何处理数据类型

如何处理具有不同值类型的字典

如何处理登录注销

Actionscript:如何处理具有相同类型但具有不同函数侦听器的事件?

使用pyhdf时如何处理py2和py3中不同类型的np.array(list)?