我有点想计算时间序列中某些数据的第95个百分位数,该时间序列在24小时内被归纳为1分钟的时间段,但是由于没有时间,某些时间段丢失了在这些垃圾箱中记录的数据。
例如,给出此表,该表已从原始数据汇总到bin中:
datatable (Timestamp: datetime, MaxRUsPerSecond: double)
[
'2020-07-06 00:01:00', 1,
'2020-07-06 00:20:00', 10
]
如果我简单地添加| summarize percentile(MaxRUsPerSecond, 95)
,它将为我提供值10
,该值在数学上是正确的,但它忽略了18个每分钟丢失的样本,应将其视为零值。
实际上,我真正想要计算的结果是这样,它的第95个百分位数为1
:
datatable (Timestamp: datetime, MaxRUsPerSecond: double)
[
'2020-07-06 00:01:00', 1,
'2020-07-06 00:02:00', 0,
'2020-07-06 00:03:00', 0,
'2020-07-06 00:04:00', 0,
'2020-07-06 00:05:00', 0,
'2020-07-06 00:06:00', 0,
'2020-07-06 00:07:00', 0,
'2020-07-06 00:08:00', 0,
'2020-07-06 00:09:00', 0,
'2020-07-06 00:10:00', 0,
'2020-07-06 00:11:00', 0,
'2020-07-06 00:12:00', 0,
'2020-07-06 00:13:00', 0,
'2020-07-06 00:14:00', 0,
'2020-07-06 00:15:00', 0,
'2020-07-06 00:16:00', 0,
'2020-07-06 00:17:00', 0,
'2020-07-06 00:18:00', 0,
'2020-07-06 00:19:00', 0,
'2020-07-06 00:20:00', 10,
]
| summarize percentile(MaxRUsPerSecond, 95)
我开始使用percentilew
来查看加权百分位数,但是感觉就像我开始钻一个兔子洞,试图添加一个合成垃圾箱以解决丢失的垃圾箱,然后根据其计算出权重丢失的垃圾箱的数量,所以我停了一分钟,看看是否还有其他人有更好的主意。
对于上下文,我正在尝试从CosmosDB帐户获取每分钟的最大吞吐量(RU / s)。这是我到目前为止的查询:
AzureDiagnostics
| where TimeGenerated >= ago(24hr)
| where Category == "DataPlaneRequests"
| summarize ConsumedRUsPerSecond = sum(todouble(requestCharge_s)) by collectionName_s, _ResourceId, bin(TimeGenerated, 1sec)
| summarize MaxRUsPerSecond = max(ConsumedRUsPerSecond) by collectionName_s, _ResourceId, bin(TimeGenerated, 1min)
基本上,将每个集合的总消耗RU放入1秒的分箱中,然后获取每分钟的最大消耗量。如果我能够得到其中的第95个百分位数(以某种方式包括丢失的1分钟垃圾箱),它将告诉我是否可以将我们的某些收藏缩小到较小的吞吐量。
答案 0 :(得分:2)
通常,您可以在数组中填充缺失值,第一种选择是使用make-series运算符,并将'default'参数指定为要用于替换缺失值或使用其中一个的值series_fill函数,例如series_fill_linear。
创建数组后,可以使用mv-expand运算符对其进行扩展并计算百分位数。
这里是一个例子:
let Start = datetime(2020-07-06 00:01:00);
let End = datetime(2020-07-06 00:21:00);
datatable (Timestamp: datetime, MaxRUsPerSecond: double)
[
datetime(2020-07-06 00:01:00), 1,
datetime(2020-07-06 00:20:00), 10
]
| make-series MaxRUsPerSecond= any(MaxRUsPerSecond) default =0 on Timestamp from Start to End step 1m
| mv-expand MaxRUsPerSecond to typeof(double), Timestamp to typeof(datetime)
| summarize percentiles(MaxRUsPerSecond, 95)