System.Timestamp()

✅ Azure 流分析

Azure 流分析中查询的每个阶段的每个事件都有一个与之关联的时间戳。 System.Timestamp() 是一个系统属性,可用于检索事件的时间戳。

下面介绍 Azure 流分析如何将时间戳分配给事件。

输入事件时间戳

输入事件的时间戳可由 TIMESTAMP BY 子句中指定的列值(或表达式)定义:

SELECT System.Timestamp() t   
FROM input   
TIMESTAMP BY MyTimeField  
  

如果未为给定输入指定 TIMESTAMP BY 子句,则事件的到达时间将用作时间戳。 例如,在事件中心输入的情况下,将使用事件排队时间。

生成的事件时间戳

执行计算时,生成的事件的时间戳是最早可以确定此结果的逻辑时间。

让我们看看 Azure 流分析(筛选器、投影、聚合和联接)中的基本查询作如何生成结果的时间戳。

Projection

SELECT  
      Prop1,  
      Prop2,  
      Prop3 - Prop4 / 12,
      System.Timestamp() t  
FROM input  
  

投影不会更改事件的时间戳,结果的时间戳与输入的时间戳相同。

Filter

SELECT *  
FROM input  
WHERE prop1 > prop2  
  

筛选器不会更改事件的时间戳。 结果的时间戳与输入的时间戳相同。

随时间推移的 GROUP BY

SELECT  
      userId,  
      AVG(prop1),  
      SUM(prop2),  
      System.Timestamp() t  
FROM input  
GROUP BY TumblingWindow(minute, 1), userId  
  

聚合结果的时间戳是此结果所对应的时间窗口的结束时间范围。 请参阅介绍 Azure 流分析中不同窗口类型的 窗口 化文章。

INNER JOIN

SELECT  
      System.Timestamp()  
FROM input1  
JOIN input2  
ON DATEDIFF(minute, input1, input2) BETWEEN 0 AND 10  
  

内部联接生成与 input1 和 input2 中的匹配事件对对应的结果。

表示 input1 中的事件 e1 和 input2 中的 e2 事件匹配的事件由 e1 和 e2 的最新时间戳进行时间戳。

LEFT OUTER JOIN

SELECT  
      System.Timestamp()  
FROM input1  
LEFT JOIN input2  
ON DATEDIFF(minute, input1, input2) BETWEEN -2 AND 10  
  

左外部联接生成两种类型的结果。 有些对应于 input1 和 input2 中的匹配事件对;其他项仅对应于 input1 的事件,并指示找不到 input2 中匹配的事件。

表示匹配(同时具有 input1 和 input2)的事件按匹配输入的最新时间戳(如上述 INNER JOIN 的情况)进行时间戳。

表示非匹配事件(input2 为 NULL)的事件按最新的逻辑时间(可能发生匹配的 input2 事件)进行时间戳。 例如,在上面的示例中,它是 input1 的时间戳 + 10 分钟。