本文属于【Azure 架构师学习笔记】系列。
本文属于【Azure Databricks】系列。
接上文 【Azure 架构师学习笔记】- Azure Databricks (13) -- 搭建Medallion Architecture part 1
前言
上文搭建了ADB 与外部的交互部分,本篇搭建ADB 内部配置来满足medallion 架构。
Volumes
相对于直接使用external location, 使用Volumes更加具有安全性和可扩展性,因为volume中不包含具体的路径,在编码时只需要指定volume名字,就如变量一样,哪怕external location的路径改变了,只需要修改volume和external location的映射关系即可,不需要修改代码。另外也避免了具体路径的暴露,加强了安全性。
Volumnes分为两类:managed和external。 managed 建立在UC schema创建时所在的托管区域,也就是说不需要指定具体路径。本质上他们就是一个指针,指向UC 管理的存储区域。
external volume 则是一个链接,指向使用storeage credential连接的外部路径(这里为ADLS),但是也由UC 管控。
bash
CREATE EXTERNAL VOLUME dev_sales.sources.landing
LOCATION 'abfss://<container>@<storage-account>.dfs.core.windows.net/'

上图为Databricks UC 的层次结构图,可以看到Volume是在最底层,所以创建volume时,需要先创建schema(Catalog在前面已经创建过了)。
如果你有MetaStore admin,就可以创建新的catalog,比如上面命令中的"dev_sales"


- Managed Tables
存储成delta table,由Databricks管理。不建议使用Databricks之外的工具操作这些表。同时他们的位置由GUID来定义,所以使用外部工具将很难定位、标识具体的表。 - External Tables
基于external location创建的表。
Managed table安全、受UC控制、但限制在UC内部;external table 灵活,支持多种源,但不受UC控制。所以选择时需要权衡。同时这些如果在创建时没有指定具体路径,那么自动继承自所属的schema, 而如果schema在创建时也没有指定路径,则schema会继承所属catalog的路径。
来自于Databricks官网的示意图:添加链接描述
Bronze to Silver
下面先准备一个excel,这里把第一列用"-"来连接两个字母,例子比较随意,只是用来演示而已。
把excel转成parquet(非必要)之后,上传到ADLS 的Bronze container中。
使用下面的python代码读取文件,如果提示需要安装某些依赖包,则按需求安装即可。
python
from pyspark.sql import SparkSession
# 初始化 Spark 会话(确保集群已附加到 UC)
spark = SparkSession.builder.getOrCreate()
# 通过 abfss 路径读取 Parquet
parquet_path = "abfss://bronze@medallionadls01.dfs.core.windows.net/uc_source.parquet"
df = spark.read.parquet(parquet_path)
# 显示数据
display(df)
结果如下:
数据处理
下面模拟进行数据的处理, 把第一列截取"-"前的数据,结果如下图:
python
df = df.withColumn('a',F.split(df['a'],'-')[0])
df.display()

使用下面代码把结果保存到Silver container:
python
df.write.format('parquet')\
.mode('append')\
.option('path','abfss://silver@medallionadls01.dfs.core.windows.net/transformed_data')\
.save()
保存后可以在ADLS 上查看,但是它并不是按照单个文件存储:

可以在ADB 中使用下面SQL 命令查询保存的文件:
sql
SELECT * FROM parquet.`abfss://silver@medallionadls01.dfs.core.windows.net/transformed_data`

关于从Silver到Gold, 更多的就是一些业务逻辑的处理上。整个Medallion 架构的流程大致如下:
