The Linux Foundation Projects
Delta Lake

Delta Connectors 0.3.0 发布

作者:Allison Portis

我们很高兴地宣布发布 Delta Connectors 0.3.0,该版本引入了对写入 Delta 表的支持。此版本的关键功能包括:

Delta Standalone

  • 写入功能 - 此版本引入了新的 API,支持在不使用 Apache Spark™ 的情况下创建和写入 Delta 表。外部处理引擎可以自行写入 parquet 数据文件,然后使用 API 以原子方式将文件添加到 Delta 表中。遵循 Delta 事务日志协议,该实现使用乐观并发控制来管理多个写入器,自动生成检查点文件,并根据协议管理日志和检查点清理。主要公开的 Java 类是 OptimisticTransaction,可以通过 DeltaLog.startTransaction() 访问。

    • OptimisticTransaction.markFilesAsRead(readPredicates) 必须用于在事务期间读取所有元数据(而不是 DeltaLog)。它用于检测并发更新,并确定此事务与先前提交的事务之间的逻辑冲突是否可以解决。
    • OptimisticTransaction.commit(actions, operation, engineInfo) 用于将更改提交到表中。如果冲突事务已首先提交(见上文),则会抛出异常,否则将返回已提交的表版本。
    • 幂等写入可以使用 OptimisticTransaction.txnVersion(appId) 来检查同一应用程序提交的版本增量。
    • 每次提交都必须指定事务正在执行的 Operation
    • 在 Microsoft Azure 和 Amazon S3 上并发写入的事务保证。此版本包括自定义扩展,以支持在 Azure 和 S3 存储系统上进行并发写入,这些系统本身不具备必要的原子性和持久性保证。请注意,事务保证仅适用于来自单个集群的 S3 上的并发写入。
  • 用于读取快照中文件的内存优化迭代器实现 - DeltaScan 引入了一种迭代器实现,用于读取快照中的 AddFiles,并支持分区剪枝。它可以通过 Snapshot.scan()Snapshot.scan(predicate) 访问,后者根据 predicate 和文件元数据中的任何分区列过滤文件。此 API 在读取 Snapshot 中的文件和实例化 DeltaLog 时(由于内部利用)显著减少了内存占用。

  • 写入操作中元数据读取和冲突检测的分区过滤 - 此版本引入了一个简单的表达式框架,用于元数据查询中的分区剪枝。在快照中读取文件时,通过将 predicate 传递给 Snapshot.scan(predicate) 来根据分区列过滤返回的 AddFiles。在事务期间更新表时,通过将 readPredicate 传递给 OptimisticTransaction.markFilesAsRead(readPredicate) 来指定读取了哪些分区,以便检测逻辑冲突并尽可能避免事务冲突。

  • 其他更新

    • ParquetSchemaConverterStructType 模式转换为 Parquet 模式。
    • Iterator<VersionLog> DeltaLog.getChanges() 公开了一个增量元数据更改 API。VersionLog 封装了版本号和该版本中的操作列表。
    • 修复了 RowRecord#197,以便可以读取分区列中的值。
    • 其他错误修复。

Delta Connectors

  • Hive Connector 的 Hive 3 支持

  • 用于原生读取 Delta 表的 Microsoft PowerBI 连接器 - 无需运行 Spark 集群,即可直接从 PowerBI 从 PowerBI 支持的任何存储系统读取 Delta 表。功能包括 PowerBI 服务中的在线/计划刷新、支持 Delta Lake 时间旅行(例如 VERSION AS OF)以及使用 Delta 表的分区模式进行分区消除。有关更多详细信息,请参阅专门的 README.md

致谢

Alex、Allison Portis、Denny Lee、Gerhard Brueckl、Pawel Kubit、Scott Sandre、Shixiong Zhu、Wang Wei、Yann Byron、Yuhong Chen、gurunath

访问发行说明以了解有关此版本的更多信息。