Delta Lake 架构验证

Delta Lake 会自动验证正在写入的数据帧的架构是否与表的架构兼容。 Delta Lake 使用以下规则来确定从数据帧到表的写入是否兼容:

  • 所有数据帧列都必须存在于目标表中。 如果数据帧中有表中不存在的列,则会引发异常。 表中存在但数据帧中不存在的列将设置为 NULL。
  • 数据帧列数据类型必须与目标表中的列数据类型匹配。 如果它们不匹配,则会引发异常。
  • 数据帧列名称不能仅通过大小写来区分。 这意味着不能在同一个表中定义诸如“Foo”和“foo”之类的列。 尽管可以在区分大小写或不区分大小写(默认)模式下使用 Spark,但 Parquet 在存储和返回列信息时区分大小写。 在存储架构时,Delta Lake 保留但不区分大小写,并采用此限制来避免潜在的错误、数据损坏或丢失问题。

Delta Lake 支持使用 DDL 显式添加新列并自动更新架构。

如果你指定其他选项(例如 partitionBy)与追加模式结合使用,则 Delta Lake 会验证它们是否匹配,在不匹配时会引发错误。 未提供 partitionBy 时,会在对现有数据分区之后自动进行追加。

注意

INSERT 语法提供架构强制并支持架构演变。 如果列的数据类型不能安全地强制转换为 Delta Lake 表的数据类型,则会引发运行时异常。 如果启用了架构演变,则新列可以作为架构的最后一列(或嵌套列)存在,以便架构得以演变。

Delta Lake 合并的架构验证

merge 自动验证通过插入和更新表达式生成的数据的架构是否与表的架构兼容。 它使用以下规则来确定 merge 操作是否兼容:

  • 对于 updateinsert 操作,指定的目标列必须存在于目标 Delta 表中。
  • 对于 updateAllinsertAll 操作,源数据集必须具有目标 Delta 表的所有列。 源数据集可以包含额外的列,它们将被忽略。
  • 对于所有操作,如果由生成目标列的表达式生成的数据类型与目标 Delta 表中的对应列不同,则 merge 会尝试将其转换为表中的类型。

请参阅 Delta Lake 合并的自动架构演变