如何通过T-SQL与OPENROWSET提取Parquet列名作为Grafana变量值
解决Grafana变量下拉显示Parquet列名的问题
一、先获取设备列表变量
你的Parquet路径是device/message/yyyy/mm/dd/xyz.parquet,直接用Synapse的filepath函数提取第一层设备名,去重后作为Grafana的设备选项:
SELECT DISTINCT REVERSE(PARSENAME(REVERSE(SUBSTRING(filepath, 1, CHARINDEX('/', filepath, CHARINDEX('/', filepath) + 1) - 1)), 1)) AS device_name FROM OPENROWSET( BULK 'https://<你的存储账户>.dfs.core.windows.net/<容器名>/*/*/*/*/*/*.parquet', FORMAT = 'PARQUET' ) AS [result]
通过字符串截取和反转精准提取路径中的设备名,DISTINCT避免出现重复选项。
二、获取选中设备对应的消息类型变量
基于Grafana中已配置的设备变量(假设变量名为${device}),提取该设备下的消息类型:
SELECT DISTINCT REVERSE(PARSENAME(REVERSE(SUBSTRING(filepath, CHARINDEX('${device}/', filepath) + LEN('${device}/'), CHARINDEX('/', filepath, CHARINDEX('${device}/', filepath) + LEN('${device}/')) - (CHARINDEX('${device}/', filepath) + LEN('${device}/')))), 1)) AS message_type FROM OPENROWSET( BULK 'https://<你的存储账户>.dfs.core.windows.net/<容器名>/${device}/*/*/*/*/*.parquet', FORMAT = 'PARQUET' ) AS [result]
同样通过路径截取锁定设备下的第二层消息文件夹,作为消息变量的选项。
三、核心:获取对应设备+消息的列名(解决显示数据而非列名的问题)
之前的查询返回了第一行数据,现在用Synapse的系统DMV sys.dm_exec_describe_first_result_set提取元数据,只返回列名:
SELECT name AS column_name FROM sys.dm_exec_describe_first_result_set( N' SELECT * FROM OPENROWSET( BULK ''https://<你的存储账户>.dfs.core.windows.net/<容器名>/${device}/${message}/*/*/*/*.parquet'', FORMAT = ''PARQUET'' ) AS [result] ', NULL, 0 ) WHERE is_hidden = 0
这个DMV会解析传入的OPENROWSET查询,返回结果集的列名、数据类型等元信息,过滤掉隐藏列后,就能得到纯列名列表,正好适配Grafana的列变量需求。
四、Grafana变量配置要点
- 三个变量的查询类型都选
SQL,数据源选择你配置的Synapse无服务器SQL(基于Microsoft SQL Server驱动的数据源)。 - 列变量的值字段和显示字段都设为
column_name,确保下拉框显示列名而非数据值。 - 设置变量依赖关系:消息变量依赖设备变量,列变量依赖设备和消息变量,开启“Refresh on change”,实现选中设备后自动更新消息选项,选中消息后自动更新列选项。
五、验证步骤
先把列名查询拿到Synapse Studio中执行,替换成实际的设备和消息路径,确认返回结果是纯列名列表(无数据行),再放到Grafana变量中测试即可。
内容的提问来源于stack exchange,提问作者mfcss
相关产品推荐
相关产品推荐

