2013-07-10 36 views
0

我有一個Azure表格,用作事件日誌。我需要最有效的方法來讀取表格的底部以檢索最近的條目。從Azure表格存儲底部讀取最有效的方法

這樣做的最有效方法是什麼?

+0

你是怎樣在這個表中定義PartitionKey和RowKey值? –

+0

@GauravMantri,是的,我確實有。 – Sam

+0

對不起,我在上面的問題中不清楚。我想問的是關於你用來定義密鑰的邏輯。例如,如果您查看由雲服務收集的診斷數據,則他們使用DateTime.Ticks(採用UTC),最高精確度爲PartitionKey。 –

回答

2

首先,我真的建議你立足於UTC的分區鍵蜱。你可以這樣做,所有的反義詞都是從最新到最古老的順序排列的。然後如果你想讓我們說100個最新的日誌,你可以調用它(可以說這個查詢是IQueryable的東西,來自你最喜歡的客戶端 - 我們使用Lucifure Stash):query.Take(100);

如果你想在一定的時間內讀取實體,你寫:query.Where(x => x.PartitionKey < = value);或類似的東西。

「value」變量必須根據構造分區鍵值的方式構造。

+0

偉大的建議,並做了我想做的。 – Sam

0

假設你想獲取的最後15分鐘的數據,試試這個僞代碼:

所有的
DateTime toDateTime = DateTime.UtcNow; 
    DateTime fromDateTime = toDateTime.AddMinutes(-15); 

    string myPartitionKeyFrom = fromDateTime.ToString("yy-MM"); 
    string myPartitionKeyTo = toDateTime.ToString("yy-MM"); 

    string query = ""; 
    if (myPartitionKeyFrom.Equals(myPartitionKeyTo))//In case both time periods fall in same month, then we can directly hit that partition. 
    { 
     query += "(PartitionKey eq '" + myPartitionKeyFrom + "') "; 
    } 
    else // Otherwise we would need to do a greater than and lesser than stuff. 
    { 
     query += "(PartitionKey ge '" + myPartitionKeyFrom + "' and PartitionKey le '" + myPartitionKeyTo + "') "; 
    } 
    query += "and (RowKey ge '" + fromDateTime.ToString() + "' and RowKey le '" + toDateTime.ToString() + "')"; 
0

如果您想獲取最新的'n'個條目,那麼您需要稍微修改您的PartitionKey和RowKey值,以便最新的條目將被推到表格的頂部。

爲此,您需要使用DateTime.MaxValue.Subtract(DateTime.UtcNow).Ticks;而不是DateTime.UtcNow來計算這兩個鍵。

0

Microsoft提供了一個SemanticLogging框架,它具有特定的接收器到log to Azure Table

如果你看一下庫的代碼,它基於一個日期時間分區鍵(按相反順序):

static string GeneratePartitionKeyReversed(DateTime dateTime) 
{ 
    dateTime = dateTime.AddMinutes(-1.0); 
    return GetTicksReversed(
     new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, dateTime.Minute, 0)); 
} 

static string GetTicksReversed(DateTime dateTime) 
{ 
    return (DateTime.MaxValue - dateTime.ToUniversalTime()) 
     .Ticks.ToString("d19", (IFormatProvider)CultureInfo.InvariantCulture); 
} 

所以,你可以在你的應用程序建立你partitionkey實現相同的邏輯。

如果要檢索特定日期範圍內的日誌,可以編寫一個查詢,看起來像:

var minDate = GeneratePartitionKeyReversed(DateTime.UtcNow.AddHours(-2)); 
var maxDate = GeneratePartitionKeyReversed(DateTime.UtcNow.AddHours(-1)); 

// Get the cloud table 
var cloudTable = GetCloudTable(); 

// Build the query 
IQueryable<DynamicTableEntity> query = cloudTable.CreateQuery<DynamicTableEntity>(); 

// condition for max date 
query = query.Where(a => string.Compare(a.PartitionKey, maxDate, 
          StringComparison.Ordinal) >= 0); 

// condition for min date 
query = query.Where(a => string.Compare(a.PartitionKey, minDate, 
          StringComparison.Ordinal) <= 0);3 
相關問題