如何在写入时强制数据集匹配其模式?
Posted
技术标签:
【中文标题】如何在写入时强制数据集匹配其模式?【英文标题】:How to force dataset to match its schema upon writing? 【发布时间】:2021-12-02 15:06:22 【问题描述】:经过一些转换,我想使用 insertInto 将 spark 数据集保存到 parquet 表中。
ds.write.mode(SaveMode.Overwrite).insertInto(tablename)
但是操作失败,给我这个错误:
[TABLENAME] requires that the data to be inserted have the same number of columns as the target table: target table has 11 column(s) but the inserted data has 19 column(s)
正确的列数是 11,是我用来构建数据集的案例类中的属性数,但是当我将其转换为数据框并显示列时,许多临时列用于转换(附加列from join etc...) 仍然存在,导致保存过程失败。
我找到的解决方法是加载表格数据并选择其列:
val tableSchema = spark.table(tablename).schema
val dfWithCorrectColumns = ds.select(tableSchema.fieldNames.map(col) : _*)
但这个解决方案似乎很老套。我知道 saveAsTable 将是具有架构强制机制的一个选项,但由于缺少动态分区覆盖,因此也不推荐这样做。
有没有一种简单的方法可以将数据集“截断”为其定义,强制执行其架构?
【问题讨论】:
【参考方案1】:如果您使用案例类 A
创建了 ds
类型为 Dataset[A]
的值,那么您可以使用以下命令将其截断为您需要的字段:
val ds_clean: Dataset[A] = ds.map(identity)
【讨论】:
以上是关于如何在写入时强制数据集匹配其模式?的主要内容,如果未能解决你的问题,请参考以下文章
Excel VBA - 搜索范围和连接的 SQL ADODB 记录集以在列中匹配写入结果集
Oracle - 如何检查多条记录中的值以及一个值是不是匹配 - 将其用于更大的数据集