如何在 Azure 流分析中进行条件测试
Posted
技术标签:
【中文标题】如何在 Azure 流分析中进行条件测试【英文标题】:How to do conditional tests in Azure Stream Analytics 【发布时间】:2018-03-27 11:04:07 【问题描述】:我已经苦苦挣扎了两天......但一直碰到 Azure 流分析不支持变量的砖墙。
我想获取一个有效载荷值,提取一个特定的字节,然后输出它......
这很简单:
SELECT
device AS Device,
dateadd(S, time, '1970-01-01') AS Time,
data AS Payload,
SUBSTRING (data, 3, 1) AS Counter,
SUBSTRING (data, 6, 1) AS Sensor1Type,
SUBSTRING (data, 8, 1) AS Sensor1State =
...等
这会在输出 blob 中返回有效负载值、计数器等,如下所示
"device":"F8A96","time":"2018-03-27T09:04:35.0000000Z","payload":"01b00200000002000000","counter":"b","sensor1type":"2","sensor1state":"0","sensor2type":"2","sensor2state":"0"
我现在想将“sensor1state”变成“Open”或“Closed”,而不是 1 或 0。
我尝试过使用 CASE、WITH 等,但无法正确处理,因为我正在使用表达式 (SUBSTRING) 的输出而不是列。
例如我试过了:
SELECT
....
SUBSTRING (data, 8, 1) AS Sensor1State =
CASE
WHEN SUBSTRING (data, 8, 1) = 1 THEN 'Closed' ELSE 'Open'
END,
...
但它给了我一个语法错误。
有什么想法吗?流分析不支持变量,所以我不能使用它。我是一个大菜鸟,所以不知道如何表演技巧。
更新:
在破解了一段时间后,解决了我自己的问题,工作查询:
SELECT
device AS Device,
dateadd(S, time, '1970-01-01') AS Time,
data AS Payload,
SUBSTRING (data, 3, 1) AS Counter,
SUBSTRING (data, 6, 1) AS Sensor1Type,
SUBSTRING (data, 14, 1) AS Sensor2Type,
CASE SUBSTRING (data, 8, 1)
WHEN '1' THEN 'Closed'
ELSE 'Open'
END as Sensor1State,
CASE SUBSTRING (data, 16, 1)
WHEN '1' THEN 'Closed'
ELSE 'Open'
END as Sensor2State
INTO
iotoutput
FROM
iotinputs
WHERE
Device = 'F8A96'
注意:我没有在任何地方看到它的文档,但是 StreamAnalytics 代码解析器中似乎存在一个错误,如果您的“INTO”语句不是直接在您的 SELECT 之后,在 FROM 之前,它会给出一个非常无用的语法错误.
【问题讨论】:
能否贴出完整的usql脚本和语法错误详情? 哇哦,在添加代码和解释错误时,我发现我做错了什么。 SQL 粘贴到原帖底部 【参考方案1】:您可以为此转换逻辑定义一个 java 脚本 UDF,然后在 asa 脚本中引用它。
function get_status(time)
var res = time.substring(8, 1);
if(res == "1") return "Closed";
else if(res == "0") return "Open";
else return "Unknown";
【讨论】:
以上是关于如何在 Azure 流分析中进行条件测试的主要内容,如果未能解决你的问题,请参考以下文章