【Azure 架构师学习笔记】- Azure Databricks (16) -- Delta Lake 和 ADLS整合

本文属于【Azure 架构师学习笔记】系列

本文属于【Azure Databricks】系列。

接上文 【【Azure 架构师学习笔记】- Azure Databricks (15) --Delta Lake 和Data Lake

前言

上文提到了Delta Lake, 但是这是一个概念,如果落实到具体的资源服务上,又会有一定的修改和限制。本文介绍一下Delta Lake如何跟Azure Data Lake Store 整合。

Delta Lake是一个开源框架,可以构建在ADLS之上。ADLS 并不内置事务保障或者Delta Lake提供的性能优化。所以单纯ADLS 很难满足现今的数据需求。

Delta Lake 与ADLS 的优势互补

ADLS 对于"存"操作是很快速的,但是对于"搜索、list"文件则很慢。Delta Lake通过减少昂贵的文件列举操作而加快数据检索。

所有的云存储系统使用扁平的命名空间。不像文件系统的层级结构,所以在list文件时很慢,就类似没有索引的数据库中的数据表,需要遍历所有数据。 ADLS 没有真正的目录,而是在对象名字前面添加前缀来实现。所以list 文件意味着系统要扫描全部文件,并且用前缀筛选。

另外, ADLS 上如果受到API 过度调用, 则会出现瓶颈,特别是对大数据集。如果一个大表的数据被拆分到ADLS 上的很多文件,那么ADLS 就要遍历所有文件,然后筛选,从而导致额外的延时。

对此,Delta Lake把文件路径存储在一个事务日志文件中,就如数据库中的索引,list文件时先从事务日志文件中查找,然后再去具体的路径中检索数据。

使用演示

下面使用Spark来演示一下如何操作Delta Lake,这里借用前面的ADB 环境,ADB 实际上非必须,只是借用上面的Spark环境。

环境配置

使用下面python命令配置Spark和Delta, 替换代码中的中文字部分即可。

python 复制代码
%python
import pyspark
from delta import *

extra_packages = [
    "org.apache.hadoop:hadoop-azure:3.3.4",
    # version must match hadoop-client-runtime
]

builder = (
    pyspark.sql.SparkSession.builder.appName("DeltaOnADLS")
    .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog")
    .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension")
    .config("spark.hadoop.fs.azurebfs.impl", "org.apache.hadoop.fs.azurebfs.AzureBlobFileSystem")
    .config("fs.azure.account.key.ADLS 名字.dfs.core.windows.net", "你的ADLS 的access key")
)

spark = configure_spark_with_delta_pip(
    builder, extra_packages=extra_packages
).getOrCreate()

如果过程中报这样的错: "org.apache.hadoop.fs.FileAlreadyExistsException: Operation failed: "This endpoint does not support BlobStorageEvents or SoftDelete. Please disable these account features if you would like to use this endpoint."

"

需要禁用ADLS 中这个设置,因为它影响了Delta的ACID 特性。

写入数据

python 复制代码
# Create sample data
data = spark.range(0, 5)

# Write data to a Delta table in ADLS
data.write.format("delta").save("abfss://bronze@medallionadls01.dfs.core.windows.net/delta-table")

写入后从ADLS 上可以看到新建了一个文件夹:

文件夹内部是具有transaction log (这里是_delta_log)的文件集合。

读取数据

执行下面命令,注意修改路径为上面写入数据的路径和文件夹

python 复制代码
# Read Delta table from ADLS
df = spark.read.format("delta").load("abfss://bronze@medallionadls01.dfs.core.windows.net/delta-table")
df.show()

结果如下:

更新和删除数据

python 复制代码
from delta.tables import DeltaTable

# Load Delta table
deltaTable = DeltaTable.forPath(spark, "abfss://bronze@medallionadls01.dfs.core.windows.net/delta-table")

# Update rows where id is less than 4
deltaTable.update("id < 4", {"id": "id + 20"})

# Delete rows where id is less than 5
deltaTable.delete("id < 5")

# Read Delta table from ADLS
df = spark.read.format("delta").load("abfss://bronze@medallionadls01.dfs.core.windows.net/delta-table")
df.show()

结果如下:

Merge数据

python 复制代码
# Merge new data into Delta table
new_data = spark.range(0, 30)

deltaTable.alias("old").merge(
    new_data.alias("new"),
    "old.id = new.id"
).whenMatchedUpdate(set={"id": "new.id"}).whenNotMatchedInsert(values={"id": "new.id"}).execute()

# Read Delta table from ADLS
df = spark.read.format("delta").load("abfss://bronze@medallionadls01.dfs.core.windows.net/delta-table")
df.show()

小结

本文演示了如何在ADLS 上搭建delta并进行了简单的数据操作。

相关推荐
Hello.Reader1 天前
Flink 对接 Azure Blob Storage / ADLS Gen2:wasb:// 与 abfs://(读写、Checkpoint、插件与认证)
flink·flask·azure
编码者卢布4 天前
【Azure 环境】获取Azure上资源的创建时间createdTime信息(ARM REST API版本)
microsoft·azure
编码者卢布5 天前
【Azure Developer】azd 安装最新版无法登录中国区问题二:本地Windows环境遇问题
microsoft·flask·azure
编码者卢布6 天前
【Azure Developer】中国区Azure环境中查看用户账号是否可用(accountEnabled)的操作步骤
microsoft·flask·azure
编码者卢布6 天前
【Azure APIM】如何实现对经过APIM并到达后端服务请求的全链路追踪呢?
python·flask·azure
编码者卢布6 天前
【Azure Stream Analytic】用 JavaScript UDF 解决 JSON 字段被转成 Record 的关键点
javascript·json·azure
编码者卢布6 天前
【Azure App Service】部署在应用服务上的WebJob中,为何会多出一个名为“DaaS“的 WebJob呢?
microsoft·azure
發糞塗牆9 天前
【Azure 架构师学习笔记】 - Azure AI(3)-数据工程在AI系统中的设计(ADF+ADLS)
人工智能·azure
宝桥南山11 天前
Power Platform - 恢复Developer environment
microsoft·微软·azure·rpa
NineData12 天前
NineData 新增支持 Azure SQL Database > PolarDB PostgreSQL
数据库·sql·azure·数据库管理工具·ninedata·数据库迁移·数据库迁移工具