标题: “写入操作” 权重: 45


Hudi支持不同类型的写入操作,这里我们可以看到它们的详细信息。

更新插入(UPSERT)

这是默认操作,输入记录首先通过查找索引被标记为插入或更新。最终,这些记录在经过启发式算法处理后被写入,以优化存储,如文件大小。这种操作适用于数据库变更捕获等用例,因为输入几乎肯定包含更新。目标表永远不会显示重复数据。

插入(INSERT)

这种操作在启发式/文件大小方面与更新插入非常相似,但完全跳过了索引查找步骤。因此,与更新插入相比,它可以快得多,适用于日志去重等用例(与下面提到的过滤重复项选项结合使用)。这也适用于表可以容忍重复数据,但只需要Hudi的事务写入/增量拉取/存储管理功能的用例。

批量插入(BULK_INSERT)

更新插入和插入操作都将输入记录保存在内存中,以加快存储启发式计算(以及其他一些事情),因此在首次加载/引导Hudi表时可能会很麻烦。批量插入提供与插入相同的语义,同时实现了基于排序的数据写入算法,可以很好地扩展到几百TB的初始加载。但是,它只是尽力调整文件大小,而不像插入/更新插入那样保证文件大小。

删除(DELETE)

Hudi支持通过启用用户指定不同的记录有效负载实现来在Hudi表上实现两种类型的删除。

  • 软删除: 保留记录键,只将所有其他字段的值设为null。这可以通过确保表模式中的相应字段可为空,然后简单地将这些字段设置为null来实现。

  • 硬删除: 从表中物理删除任何记录痕迹。这可以通过三种不同的方式实现:

    • 使用DataSource,将OPERATION_OPT_KEY设置为DELETE_OPERATION_OPT_VAL。这将删除提交的DataSet中的所有记录。

    • 使用DataSource,将PAYLOAD_CLASS_OPT_KEY设置为"org.apache.hudi.EmptyHoodieRecordPayload"。这将删除提交的DataSet中的所有记录。

    • 使用DataSource或DeltaStreamer,在DataSet中添加一个名为_hoodie_is_deleted的列。此列的值必须设置为true以删除所有记录,并设置为false或留空以更新任何记录。