2010-05-05 128 views
2

我正在使用C#和亞馬遜的AWSSDK庫來測試SimpleDB中的一些東西。一切進展順利。Amazon SimpleDB - 有沒有辦法列出域中的所有屬性?

但是,我試圖想出一個簡潔的方式來檢索適用於域的所有屬性。這被證明是棘手的,無需檢索一個項目,顯然我可以獲得屬性列表。但是如果我在一個域中有100,000個項目呢?比方說,第一個70000個項目在「人」域有:

名字,姓氏,地址

然後我打的有

名字,姓氏,地址一個項目,電話

然後我打左右80,000標誌,它還有另一個項目:

名字,姓氏,電子郵件,電話

在上面的EXA mple,對於個人域名,我將如何得到一個包含列表:

名字,姓氏,地址,電子郵件,電話

...不執行select語句的荒謬多少?

非常感謝!

回答

2

對於包含多個項目的域,您應該能夠使用隨機抽樣方法獲得高度準確的屬性列表。下面是一些C#-ish僞代碼:

int domainCount = "select count(*) from Person"; 
int avgSkipCount = domainCount/2500; 
int processedCount = 0; 
string nextToken = null; 
Set attributeNames; 

do 
{ 
    int nextSkipCount = Random.Next(0, avgSkipCount*2); 
    string nextToken = "select count(*) from Person limit " + nextSkipCount; 
    var countRequest = new SelectRequest 
    { 
    NextToken = nextToken, 
    SelectExpression = "select count(*) from Person limit " + nextSkipCount 
    }; 
    var countResponse = SimpleDb.Select(countRequest); 
    nextToken = countResponse.NextToken; 
    processedCount += countResponse.Count; 

    var getRequest = new SelectRequest 
    { 
    NextToken = nextToken, 
    SelectExpression = "select * from Person limit 1" 
    }; 
    var getResponse = SimpleDb.Select(getRequest); 
    nextToken = getResponse.NextToken; 
    processedCount++; 

    attributeNames.Add(getResponse.AttributeNames); 

} while (domainCount > processedCount); 

這依賴於事實,你可以使用的nextToken從SELECT COUNT(*)查詢返回的記載跳過的SimpleDB的。 Mocky寫了an excellent explanation of how to accomplish this。我已經解釋了how to accomplish efficient paging like this with Simple Savant

這對大多數數據集來說可以達到99%的準確率,這些數據集對於大多數實際應用來說應該足夠好。統計理論認爲,2500的樣本大小可以爲任何大小的數據集有效地提供相同的精度,所以這種方法甚至可以擴展到數百萬個項目。

這顯然不理想,因爲它仍然需要大量的查詢,但如果數據集的屬性變化數量相對有限,您應該可以用更小的樣本大小完成同樣的事情。

相關問題