如何在Azure Stream Analytics中进行条件测试

时间:2018-03-27 11:04:07

标签: azure azure-stream-analytics

我已经苦苦挣扎了两天......但是一直认为Azure Stream Analytics不支持变量。

我想获取有效负载值,提取特定字节并输出...

这很简单:

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中返回Payload值,Counter等,如下所示

{"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,
...

但它给我一个语法错误。

有什么想法吗? Stream Analytics不支持变量,因此我无法使用它。我是一个主要的菜鸟,所以不知道如何表演技巧。

更新

经过一段时间的黑客攻击,解决了我自己的问题,工作查询:

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之前,它会给出一个非常无用的语法错误。

1 个答案:

答案 0 :(得分: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";
}