我在消息中通过属性“ 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? 您能建议任何解决方法吗?
答案 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