Delta Lake 0.5.0 正式发布,支持包括 Hive/Presto 等多种查询引擎

Delta Lake 0.5.0 正式发布,支持包括 Hive/Presto 等多种查询引擎_第1张图片

Delta Lake 0.5.0 于2019年12月13日正式发布,正式版本可以到 https://github.com/delta-io/delta/releases/tag/v0.5.0 使用。这个版本支持多种查询引擎查询 Delta Lake 的数据,比如常见的 Hive、Presto 查询引擎。并发操作得到改进。当然,这个版本还是不支持直接使用 SQL 去增删改查 Delta Lake 的数据,这个可能得等到明年1月的 Apache Spark 3.0.0 的发布。好了,下面我们来详细介绍这个版本的关键特性。

通过使用 manifest 文件来支持多种查询引擎

在之前版本的 Delta Lake,只支持使用 Spark 去查询 Delta Lake 的数据,使得它的使用场景有点限制。但是通过引入了 manifest 文件(参加 #76),我们可以使用 Presto/Amazon Athena 等查询引擎去查询 Delta Lake 的数据。Amazon Athena 是一种交互式查询服务,让您能够轻松使用标准 SQL 直接分析 Amazon S3 中的数据,其内部是使用 Presto 实现的。

manifest 文件的生成可以使用 Scala, Java, Python 以及 SQL 去实现,具体可以参见 Delta Lake 的最新文档:Presto and Athena to Delta Lake Integration。

除了支持 Presto/Amazon Athena,还支持 Redshift Spectrum(Amazon Redshift 是一种快速、完全托管的 PB 级数据仓库服务,它使得用现有商业智能工具对您的所有数据进行高效分析变得简单而实惠,Amazon Redshift 不能直接分析 S3 上的数据,他需要将 S3 上的数据拷贝到 Amazon Redshift 才行;而 Redshift Spectrum 是 Amazon Redshift 的一项新功能,它支持直接分析 S3 上的数据。)、Snowflake(这个是美国的一家公司的数据湖产品,支持分析 S3 上的数据) 以及 Hive(只支持查 Delta Lake 的数据,不支持 metastore)。

但是毕竟不是通过 manifest 文件实现的,所以有一些 Delta Lake 原生的功能暂不支持,比如数据一致性可能不能保证,底层的模式发生变化上层查询引擎会不感知,得重新建立。具体可以参见 limitations。

更好的并发操作支持

现在我们可以同时运行更多的 Delta Lake 操作。这个实现是通过将 Delta Lake 乐观并发控制的冲突检测变得更细粒度解决的。这使得我们可以在 Delta Lake 表上运行更加复杂的工作流:

在添加新分区时,同时删除旧分区;在不相交的分区上并发地运行更新(updates)和合并(merges);在数据压缩的时候同时对 Delta Lake 添加数据。具体参见 并发控制。

改进了对文件压缩的支持

在压缩数据的时候现在可以通过将 DataFrameWriter 的选项 dataChange 设置为 false 来重新编写文件。通过这个选项允许压缩操作与其他批处理和流操作并发运行。关于如何使用可以参见 压缩文件。

改进了纯插入合并( insert-only merge)的性能

Delta Lake 现在为只有插入子句而没有更新子句的合并操作提供了更优化的性能。此外,Delta Lake 确保这种 insert-only merge 操作只会向表中追加(append)新数据。举个例子,常见的 ETL 操作将收集到的数据追加到 Delta Lake 表中,然而,这些源常常会生成重复的日志记录,需要下端来删除这些重复的数据,而有了这个功能,我们可以避免插入重复的记录。具体可以参见 这里。

通过 SQL 将 Parquet 表转换成 Delta Lake 表

在 Delta Lake 0.4.0 版本,已经支持使用 Scala, Java 以及 Python 来实现这个目的。为了使用更加方便,Delta Lake 0.5.0 版本支持直接通过 SQL 将 Parquet 表转换成 Delta Lake 表,具体如下:

-- Convert unpartitioned parquet table at path 'path/to/table'
CONVERT TO DELTA parquet.`path/to/table`

-- Convert partitioned parquet table at path 'path/to/table' and partitioned by integer column named 'part'
CONVERT TO DELTA parquet.`path/to/table` PARTITIONED BY (part int)

更加完整的文档可以参见 convert-to-delta。

猜你喜欢

1、我花了10个小时,写出了这篇K8S架构解析

2、Kylin 在 58 集团的实践和应用

3、GitHub 长期被中国人“霸榜”?看完榜单我呆了...

4、Spark SQL在携程的实践经验分享

过往记忆大数据微信群,请添加微信:fangzhen0219,备注【进群】

你可能感兴趣的:(Delta Lake 0.5.0 正式发布,支持包括 Hive/Presto 等多种查询引擎)