本文屬于【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 管控。
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代碼讀取文件,如果提示需要安裝某些依賴包,則按需求安裝即可。
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)
結果如下:
數據處理
下面模擬進行數據的處理, 把第一列截取“-”前的數據,結果如下圖:
df = df.withColumn('a',F.split(df['a'],'-')[0])
df.display()
使用下面代碼把結果保存到Silver container:
df.write.format('parquet')\.mode('append')\.option('path','abfss://silver@medallionadls01.dfs.core.windows.net/transformed_data')\.save()
保存后可以在ADLS 上查看,但是它并不是按照單個文件存儲:
可以在ADB 中使用下面SQL 命令查詢保存的文件:
SELECT * FROM parquet.`abfss://silver@medallionadls01.dfs.core.windows.net/transformed_data`
關于從Silver到Gold, 更多的就是一些業務邏輯的處理上。整個Medallion 架構的流程大致如下: