azure-sql-database - 流分析 - 如何处理参考输入中的 json
问题描述
我有一个 Azure 流分析 (ASA) 作业,它处理来自事件中心的设备遥测数据。流应该与来自 sql 表的参考数据连接,以使用额外的设备元数据增强每条消息。合并的条目应存储在 CosmosDb 中。
为设备元数据提供服务的 sql 数据库:
CREATE TABLE [dbo].[MyTable]
(
[DeviceId] NVARCHAR(20) NOT NULL PRIMARY KEY,
[MetaData] NVARCHAR(MAX) NULL /* this stores json, which can vary per record */
)
在 ASA 中,我使用一个简单的查询配置了参考数据输入:
SELECT DeviceId, JSON_QUERY(MetaData) FROM [dbo].[MyTable]
我有执行连接的主要 ASA 查询:
WITH temptable AS (
SELECT * FROM [telemetry-input] TD PARTITION BY PartitionId
LEFT OUTER JOIN [metadata-input] MD
ON TD.DeviceId = MD.DeviceId
)
SELECT TD.*, MD.MetaData
INTO [cosmos-db-output]
FROM temptable PARTITION BY PartitionId
这一切正常,合并的数据存储在 CosmosDb 中。但是,来自 sql 的 Metadata 列的值被视为字符串,并使用引号和转义字符存储在 comos 中。例子:
{ "DeviceId" : "abc1234", … , "MetaData" : "{ \"TestKey\": \"test value\" }" };
有没有办法将元数据中的 json 存储为适当的 Json 对象,即
{ "DeviceId" : "abc1234", … , "MetaData" : { "TestKey": "test value" } };
解决方案
我找到了在 ASA 中实现它的方法 - 你需要创建javascript 用户函数:
function parseJson(strjson){
return JSON.parse(strjson);
}
并在您的查询中调用它:
...
SELECT TD.*, udf.parseJson(MD.MetaData)
...
推荐阅读
- java - 多项目设置的 Spotbugs 配置
- javascript - using reduce to flatten array in JavaScript
- tensorflow - 带有张量流的自动编码器
- scala - 在火花中加载到数据框时如何修剪字段?
- ios - Swift 强委托参考
- javascript - 如何插入当前 url 链接以形成值?
- git - How to merge two local branches when git-merge and git-rebase says "Already up to date" but git-diff clearly shows the differences
- c - './run' 中的错误:损坏的大小与 prev_size:0x000056533910b020
- sql - 如何在sql中用n/a替换null?
- django - 如何在 Django 的下拉列表中集成多选字段