如何在不使用Azure Analytics Services的情况下,通过Synapses Serverless SQL pool在Delta Lake构建维度模型?
在Synapse Serverless SQL Pool上基于Delta Lake构建维度模型(无需Azure Analytics Services)
前置条件
- 已部署Azure Synapse Analytics工作区及Serverless SQL池
- Delta Lake数据存储在Azure Data Lake Storage (ADLS) Gen2中,且Serverless SQL池拥有该存储的读取权限(可通过SAS密钥、托管身份或RBAC配置)
- 已明确Delta Lake中事实表、维度表的源数据结构与分布
具体操作步骤
1. 验证Delta Lake访问连通性
先通过OPENROWSET测试Serverless SQL池能否正常读取Delta Lake数据:
SELECT TOP 10 * FROM OPENROWSET( BULK 'https://<你的ADLS账户名>.dfs.core.windows.net/<容器名>/<Delta Lake数据路径>', FORMAT = 'DELTA' ) AS [result]
若返回数据则访问正常;若报错,检查存储路径或权限配置。
2. 创建外部数据源(可选但推荐)
为简化后续路径引用,创建指向ADLS Delta Lake根路径的外部数据源:
CREATE EXTERNAL DATA SOURCE DeltaLakeSource WITH ( LOCATION = 'https://<你的ADLS账户名>.dfs.core.windows.net/<容器名>/<Delta Lake基础路径>', TYPE = HADOOP );
3. 构建维度表
维度表存储静态或缓慢变化的业务维度(如日期、客户、产品),以下是两种实现方式:
方式一:创建实时访问视图
适合需要实时获取最新维度数据的场景:
CREATE VIEW dim_date AS SELECT date_key, full_date, year, quarter, month, day_of_month, day_of_week FROM OPENROWSET( BULK '<日期维度的Delta Lake路径>', -- 可使用相对外部数据源的路径,或完整ADLS路径 DATA_SOURCE = 'DeltaLakeSource', -- 未创建外部数据源则省略此行,直接用完整BULK路径 FORMAT = 'DELTA' ) AS date_source WHERE is_current = 1 -- 针对缓慢变化维度(SCD2)过滤当前有效记录
方式二:创建物化视图(性能优化)
适合查询频率高、对性能要求高的场景,支持增量刷新:
CREATE MATERIALIZED VIEW dim_customer WITH (DISTRIBUTION = ROUND_ROBIN) AS SELECT customer_key, customer_id, customer_name, email, address, current_flag, start_date, end_date FROM OPENROWSET( BULK '<客户维度的Delta Lake路径>', DATA_SOURCE = 'DeltaLakeSource', FORMAT = 'DELTA' ) AS customer_source
手动刷新物化视图:
REFRESH MATERIALIZED VIEW dim_customer;
4. 构建事实表
事实表存储业务事件数据(如销售订单、交易记录),同样基于Delta Lake创建视图:
CREATE VIEW fact_sales AS SELECT sales_key, date_key, customer_key, product_key, quantity, unit_price, total_amount, sales_timestamp FROM OPENROWSET( BULK '<销售事实的Delta Lake路径>', DATA_SOURCE = 'DeltaLakeSource', FORMAT = 'DELTA' ) AS sales_source
5. 构建星型/雪花型关联模型
通过视图关联事实表与维度表,形成可直接查询的维度模型:
CREATE VIEW sales_star_schema AS SELECT f.sales_key, f.total_amount, f.quantity, d.full_date, d.year, d.month, c.customer_name, c.email, p.product_name, p.category FROM fact_sales f JOIN dim_date d ON f.date_key = d.date_key JOIN dim_customer c ON f.customer_key = c.customer_key JOIN dim_product p ON f.product_key = p.product_key
6. 验证模型可用性
执行查询测试模型关联是否正常:
SELECT d.year, d.month, p.category, SUM(f.total_amount) AS total_sales FROM sales_star_schema GROUP BY d.year, d.month, p.category ORDER BY d.year, d.month, total_sales DESC
关键注意事项
- SCD处理:针对SCD2类型的维度数据,需通过
current_flag或时间范围字段过滤当前有效版本 - 性能优化:大体积Delta Lake表可通过分区列(如
date_key)在OPENROWSET中指定PARTITION参数,减少数据扫描范围 - 权限管控:确保Serverless SQL Pool的服务主体或用户拥有ADLS的
Storage Blob Data Reader权限,避免访问被拒
内容的提问来源于stack exchange,提问作者Abhijit
相关产品推荐
相关产品推荐

