如何在运行 Azure 流分析查询时获取系统时间
Posted
技术标签:
【中文标题】如何在运行 Azure 流分析查询时获取系统时间【英文标题】:How to get system time while running Azure Stream Analytics Query 【发布时间】:2018-05-08 04:13:30 【问题描述】:在应用程序中,有一组事件到达事件中心,作为流分析的一部分,我有一组要求,其中一个是查明某些记录集是否在最近 x 中没有到达事件中心分钟。我在消息中有一个时间戳,它告诉我消息的有效时间,但是为了计算延迟(在消息的有效时间和 now() 之间),我需要在运行时知道当前时间戳查询。
我尝试了 System.Timestamp,但它给了我值“1970-01-01T12:01:01.0010000Z”
消息的入队时间戳是最新的,例如“2018-05-06T00:00:00.1000000Z”...但不知道为什么 System.timestamp 没有返回我入队时间(当我没有使用“Timestamp By " 子句)。
所以,我有两个问题:
-
在执行流分析查询时如何获取服务器的当前时间戳。
为什么 system.timestamp 不返回入队时间戳
查询: 选择 System.Timestamp as ts 从 来源
结果: "1970-01-01T12:01:01.0010000Z"
输入数据中的时间戳都不早于 2018 年 5 月 6 日。
谢谢, 拉杰尼什
【问题讨论】:
【参考方案1】:消息的入队时间戳是最新的,例如“2018-05-06T00:00:00.1000000Z”...但不知道为什么 System.timestamp 没有返回我入队时间(当我没有使用“Timestamp By " 子句)。
正如System.Timestamp (Stream Analytics) 所述:
如果没有为给定输入指定 TIMESTAMP BY 子句,则将事件的到达时间用作时间戳。例如,在事件中心输入的情况下,将使用事件的排队时间。
我刚刚测试了这个问题,发现如果你只是测试Azure Portal的“JOB TOPOLOGY > Query”下的查询,那么对于没有指定TIMESTAMP BY子句的方法,System.Timestamp的值会是1970-01-01T12:01:01.0010000Z
.在指定 TIMESTAMP BY 子句时,System.Timestamp 的值将是您在 TIMESTAMP BY 子句中指定的列值。
然后,我刚刚为我的作业创建了一个 Blob 输入和 Blob 输出,然后在概览选项卡下,单击开始运行我的流分析作业,我可以成功检索到 System.Timestamp 的正确值。
查询:
SELECT birth,name,System.Timestamp as t
into output
FROM input
测试:
更新:
在执行流分析查询时如何获取服务器的当前时间戳。
根据您的要求,我假设您可以使用javascript UDF。我刚刚创建了一个示例 UDF,如下所示:
function main(s)
return new Date().toISOString();
测试:
您可以计算 UDF 中的延迟或利用内置函数 Date and Time Functions。
【讨论】:
谢谢布鲁斯...这回答了第二个问题...对于第一个问题:假设我没有收到任何数据,我需要检测到,在这种情况下,我需要知道系统时间戳(服务器的)而不是入队时间(因为事件中心中没有消息)。有没有办法找到流分析服务器当前时间戳而不考虑源数据? System.Timestamp 要么告诉我入队时间,要么告诉我一些数据元素(这是一个时间戳)值(通过 Timestamp By 子句)......但我的要求是找出 x 秒内是否不存在特定类型的消息。跨度> 为了您的要求,我做了一些测试。您可以按照我的回答中的更新部分进行操作。以上是关于如何在运行 Azure 流分析查询时获取系统时间的主要内容,如果未能解决你的问题,请参考以下文章