Fabric Data Warehouse(数据仓库)与 Fabric User Data Functions(用户自定义函数)的集成已进入预览阶段。这项能力的核心价值在于:你不再需要为了跑一段 Python 逻辑而单独搭一套应用或管道,直接在 T-SQL 里调用 Python 函数即可。对于长期在仓库层用 T-SQL 做数据加工的团队来说,这意味着扩展能力的路径变短了——自定义逻辑以函数的形式注册一次,就能在 SELECT、INSERT、UPDATE 等常规语句中反复调用。
具体机制是:在 Warehouse 中创建 T-SQL 外部函数(EXTERNAL FUNCTION),指向某个 User Data Functions 项里的 Python 函数。调用发生时,Data Warehouse 把执行委托给 User Data Functions 运行时,结果再回到 T-SQL 查询中。这种"T-SQL 编排、Python 执行"的分工,让两边各自发挥擅长的部分。
典型场景:T-SQL 不擅长的事交给 Python
集成覆盖的场景相当务实,基本围绕 T-SQL 的短板展开:
- 调用外部能力:触发 Fabric 或外部 API,发送邮件、Teams 消息或通知。
- 解析非结构化文件:借助 Python 读取 Excel、XML、PDF 等格式。
- 跨源访问数据:读写 OneLake 中的数据,以及跨工作区访问 Fabric 数据库、Azure Cosmos DB 和仓库。
- 管理密钥与配置:从 Azure Key Vault 或 Fabric variable libraries(变量库)获取机密和配置值,用于参数化自定义逻辑。
- 敏感数据处理:用自定义 Python 逻辑配合组织管理的密钥,对敏感列做加密、解密或脱敏。
- 数据增强与校验:地址地理编码、VAT/IBAN 号码验证,或用机器学习模型给记录打分。
这些任务的共同点是:用 T-SQL 实现要么极其笨拙,要么根本做不到,而 Python 生态里有现成的标准库或 SDK。
实例:用 Python 对 IPv6 事件做网络前缀分类
按网络前缀对 IPv6 事件分类,是安全分析的常见需求。但 IPv6 地址的解析和二进制运算在 T-SQL 里写起来相当痛苦。Python 标准库里的 ipaddress 模块正是为此而生。
下面的 Python 函数接收一个 IPv6 地址和前缀长度,返回 CIDR 表示法下的网络前缀:
import ipaddress
import fabric.functions as fn
udf = fn.UserDataFunctions()
@udf.function()
def getIpv6Network(address: str, prefixLength: int) -> str:
interface = ipaddress.ip_interface(f"{address}/{prefixLength}")
return str(interface.network)
发布后,将它映射为 T-SQL 外部函数:
CREATE FUNCTION ipv6.get_network
AS EXTERNAL FUNCTION utilities.getIpv6Network;
接着就能在更新语句中为每条事件计算并持久化 /48 网络前缀:
UPDATE dbo.NetworkEvents
SET NetworkPrefix = ipv6.get_network(SourceIp, 48)
WHERE NetworkPrefix IS NULL;
每次调用 ipv6.get_network 都会委托给 User Data Functions 运行时执行。结果写入 NetworkPrefix 列后,下游查询直接使用该列即可,无需重复计算——这一点很关键,把计算成本一次性摊掉,而不是让每个分析查询都重新解析地址。
几点实践观察
从编辑视角看,这项集成有几个值得注意的地方。其一,外部函数的调用是逐行的,在大批量 UPDATE 场景下要留意 User Data Functions 运行时的吞吐表现,必要时先用小样本验证。其二,把密钥读取放在函数内部虽然方便,但要注意函数被频繁调用时的额外开销,能缓存的配置值尽量缓存。其三,这种模式最适合"计算一次、复用多次"的场景,比如上面的网络前缀持久化,而不是在每次查询时实时调用外部 API。
收束
Fabric User Data Functions 与 Data Warehouse 的集成,本质上是把 Python 的表达力嵌进了 T-SQL 的工作流,让团队不必为了个别复杂逻辑而分裂出独立的应用或管道。预览阶段是验证适用边界的好时机:哪些逻辑值得注册为外部函数、哪些仍应留在纯 T-SQL 里,需要在真实负载下判断。相关用法可参阅官方文档,反馈也可以通过 Microsoft Fabric 社区提交。


