导入
什么是 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