如何在写入时强制数据集匹配其模式?

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)

【讨论】:

以上是关于如何在写入时强制数据集匹配其模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用模式匹配过滤类型化的 Spark 数据集

Excel VBA - 搜索范围和连接的 SQL ADODB 记录集以在列中匹配写入结果集

如何在 SAS 中获取一个数据集并将其拆分为两个

Oracle - 如何检查多条记录中的值以及一个值是不是匹配 - 将其用于更大的数据集

存储和比较 android 传感器(加速度计)数据集以匹配模式

R:具有 2 个大型数据集的模式匹配金融时间序列数据: