Logo
Section 1 / 3

什么是 Delta Lake?

了解传统数据湖为何会失败,以及 Delta Lake 如何通过版本控制和 ACID 事务提供可靠的存储。

导入

什么是 Delta Lake?

了解传统数据湖为何会失败,以及 Delta Lake 如何通过版本控制和 ACID 事务提供可靠的存储。

...
How Delta Lake fits into your data stack

传统数据湖 vs. Delta Lake

无 Delta Lake含 Delta Lake
文件可使用不一致或错误的模式写入。模式强制机制阻止与表定义结构不匹配的写入操作。
并发写入者可能相互覆盖并破坏表。ACID 事务协调并发写入,确保结果一致。
覆盖文件会永久删除之前的版本。每次更改都会创建一个新版本,并记录在事务日志中,保留完整历史。
修复错误需要手动恢复或重写文件。时间旅行支持即时查询或恢复任意先前版本。
批处理和流式处理管道通常需要单独的表或管道。单个 Delta 表同时支持批处理和流式读写。
查询性能严重依赖手动文件组织。Delta 通过数据跳过、索引和文件合并等特性自动优化存储。
数据湖难以用于可靠的生产工作负载。Delta Lake 提供生产级可靠性,具备 ACID 事务、模式强制和版本历史,适用于分析、机器学习和报告。

创建一个小 DataFrame 并将其保存为 DBFS 中的 Delta 表

1from pyspark.sql import SparkSession 2from pyspark.sql.types import StructType, StructField, StringType, IntegerType 3 4spark = SparkSession.builder.getOrCreate() 5 6data = [("Alice", 100), ("Bob", 200)] 7schema = StructType([ 8 StructField("name", StringType(), True), 9 StructField("sales", IntegerType(), True) 10]) 11 12df = spark.createDataFrame(data, schema) 13 14# 保存为托管 Delta 表 15df.write.format("delta").mode("overwrite").saveAsTable("sales")
...
DBFS 视图显示 Delta 表默认存储的文件夹

将 Delta 表加载到 DataFrame 并显示其内容

1delta_df = spark.table("sales") 2delta_df.show()
...
delta_df.show() 的输出,显示当前 Alice 和 Bob 的销售数据

更新 Alice 的销售额

1from delta.tables import DeltaTable 2 3delta_table = DeltaTable.forName(spark, "sales") 4 5delta_table.update( 6 condition="name = 'Alice'", 7 set={"sales": "150"} 8) 9spark.table("sales").show()
...
更新后的表格显示 Alice 的销售额为 150,Bob 的销售额为 200

使用时间旅行查询原始版本

1old_df = spark.read.format("delta").option("versionAsOf", 0).table("sales") 2 3old_df.show()
...
时间旅行后的表格显示原始版本,其中 Alice 的销售额为 100

Databricks 中的 PySpark 基础

写入和读取 Delta 表