我正在尝试查询Azure诊断生成的WadPerformanceCountersTable,它具有基于刻度标记的PartitionKey,精确到分钟。此PartitionKey存储为字符串(我无法控制)。
我希望能够查询此表以获取每分钟,每小时,每天等的数据点,因此我不必提取所有数据(我只想要抽样到近似它)。我希望使用模数运算符来执行此操作,但由于PartitionKey存储为字符串而且这是一个Azure表,因此我遇到了问题。
有没有办法做到这一点?
非工作示例:
var query =
(from entity in ServiceContext.CreateQuery<PerformanceCountersEntity>("WADPerformanceCountersTable")
where
long.Parse(entity.PartitionKey) % interval == 0 && //bad for a variety of reasons
String.Compare(entity.PartitionKey, partitionKeyEnd, StringComparison.Ordinal) < 0 &&
String.Compare(entity.PartitionKey, partitionKeyStart, StringComparison.Ordinal) > 0
select entity)
.AsTableServiceQuery();
答案 0 :(得分:0)
如果您只想基于两个不同的时间间隔(现在和N回时)获得单行,您可以使用以下查询返回单行,如here所述:
// 10 minutes span Partition Key
DateTime now = DateTime.UtcNow;
// Current Partition Key
string partitionKeyNow = string.Format("0{0}", now.Ticks.ToString());
DateTime tenMinutesSpan = now.AddMinutes(-10);
string partitionKeyTenMinutesBack = string.Format("0{0}", tenMinutesSpan.Ticks.ToString());
//Get single row sample created last 10 mminutes
CloudTableQuery<WadPerformanceCountersTable> cloudTableQuery =
(
from entity in ServiceContext.CreateQuery<PerformanceCountersEntity>("WADPerformanceCountersTable")
where
entity.PartitionKey.CompareTo(partitionKeyNow) < 0 &&
entity.PartitionKey.CompareTo(partitionKeyTenMinutesBack) > 0
select entity
).Take(1).AsTableServiceQuery();
答案 1 :(得分:0)
我能看到这样做的唯一方法是创建一个进程,使Azure表与其自身的另一个版本保持同步。在此表中,我将PartitionKey存储为数字而不是字符串。完成后,我可以使用类似于我在问题中写的方法来查询数据。
然而,这是浪费资源,所以我不推荐它。 (我自己也没有实现它。)