Apache Spark  发布了 Delta Lake 0.4.0,主要支持 DML 的 Python API、将 Parquet 表转换成 Delta Lake 表 以及部分 SQL 功能。 

图片

下面详细地介绍这些功能

部分功能的 SQL 支持

SQL 的支持能够为用户提供极大的便利,如果大家去看数砖的 Delta Lake 产品,你肯定已经看到它已经支持了 SQL 语法。但是开源的 Delta Lake 在这个版本之前只支持使用 Scala\Java 去创建、删除、更新 Delta Lake 表。

值得高兴的是,从 0.4.0 版本开始,Delta Lake 已经开始支持一些命令的 SQL 语法了。由于 Delta Lake 是单独的一个项目,如果需要让它支持所有的 SQL 语法,需要从 Apache Spark 里面拷贝大量的代码到 Delta Lake 项目中,不便于维护,所以这个版本只支持 vacuum 和 history 简单命令的 SQL 语法。

其他的 delete、update 以及 merge 的 DML 操作支持可能得等到 Spark 3.0 版本才会支持的。目前社区也在 Spark 3.0 里面的 DataSource V2 API 里面添加了对 DELETE/UPDATE/MERGE 的支持,详情参见 https://issues.apache.org/jira/browse/SPARK-28303。相信在未来版本,这些基本的 SQL 语法支持也会逐渐支持。

用于 DML 和实用操作的 Python API

在 0.4.0 版本之前,Delta Lake 只支持 Scala 和 Java API。为了能够在 Python 中使用 Delta Lake,这个版本引入了 Python API(具体可以参见 https://github.com/delta-io/delta/issues/89),可以用它在 Delta Lake 表来进行 update\delete\merge 等操作。

我们还可以使用这个 Python API 运行一些实用操作,比如 vacuum、history等。这样 Python 和 Scala\Java 的 API 功能就对齐了。更多关于 Python API 的使用可以参见 Delta Lake 的官方文档。

将 Parquet 表转换成 Delta Lake 表

如果我们有一张 parquet 的普通表,然后我们想把它转换成  Delta Lake 表,在这之前我们需要先读出这张表,然后再写成 Delta Lake 表。如果我们的 parquet 表非常大,这需要很多的资源去转换。这个版本为我们提供了转换命令,直接可以在原地将 Parquet 表转换成 Delta Lake 表,注意这里说的是原地,意味着不需要将数据从一个地方挪到另外一个地方,也不需要将所有数据读出再写到原目录这个命令会列出 Parquet 表的所有文件,然后通过自动读取所有 Parquet 文件的 footer 位置获取表的模式,最后生成一个 transaction log 来追踪这些文件。然,如果你不需要 Delta Lake 表,你也可以使用这个命令将它再转回成普通的 Parquet 表。