Azure流分析查询-如何基于javascript udf函数设置均匀时间戳?

时间:2018-12-27 08:29:29

标签: azure-stream-analytics

我在消息中通过属性“ TS”为数据流输入事件添加时间戳。但是,在使用TS为其打时间戳之前,我想确保TS符合ISO8601。如果TS不是ISO8601的标准,我想使用EventEnqueuedUtcTime作为消息的到达时间作为时间戳。

我的查询看起来像这样

SELECT 
  T.*
FROM
  input TIMESTAMP BY PARTITION BY PartitionId TIMESTAMP BY udf.getEventTimestamp(T)

如果udf.getEventTimestamp(T)如果符合ISO8601标准,则在message(T)中返回TS属性,否则将返回EventEnqueuedUtcTime(消息在Iot Hub中的到达时间)。

在本地运行此脚本会给我一个例外- Error : Unexpected hosted function call

我还尝试使用CASE构造来实现这一目标

SELECT 
  T.*
FROM
  input TIMESTAMP BY PARTITION BY PartitionId TIMESTAMP BY
  CASE
    WHEN udf.isValid(T.TS) THEN T.TS
    ELSE T.EventEnqueuedUtcTime 
  END

如果属性TS是符合ISO8601的有效时间戳记,则udf.isValid(T.TS)返回true。

再次在本地运行此命令将返回-Error : Unexpected hosted function call

根据Microsoft Azure文档,After you add a JavaScript user-defined function to a job, you can use the function anywhere in the query, like a built-in scalar function

这是否意味着我们不能在TIMESTAMP BY和CASE构造中使用udfs? 您能建议任何解决方法吗?

1 个答案:

答案 0 :(得分:2)

目前,我们无法在TIMESTAMP BY子句中使用UDF。 但是,我们使用TRY_CAST来满足您的要求。 以下是具有解决方法的查询:

 SELECT 
 T.*
 FROM
 input PARTITION BY PartitionId TIMESTAMP BY
   CASE
     WHEN TRY_CAST(T.TS AS DateTime) is not null THEN T.TS
     ELSE T.EventEnqueuedUtcTime 
   END

让我知道您是否还有其他问题。

谢谢

JS