2012-10-12 2 views
8

현재 PartitionKey를 사용하여 데이터를 저장하는 장치를 Azure Table Services로 구분합니다. 필자는이 데이터를 탐색 할 수있는 뷰어를 만들고 싶습니다. 그러나 데이터를 "장치 별"또는 PartitionKey로 볼 수 있도록 구조화 할 수 있으면 좋을 것입니다. 뷰어 앱에는 어떤 장치가 있는지 알 수 없으므로 주어진 테이블에서 별개의 PartionKeys 목록을 얻을 수 있다면 좋을 것입니다. 이것이 가능할까요, 아니면 각 장치에 새로운 행을 삽입 한 다음 메타 데이터 테이블을 쿼리에 사용하는 것으로 강등 될 것입니까?테이블에서 구분 된 PartionKeys를 가져 오는 방법이 있습니까

답변

6

모든 파티션 키를 검색하는 방법이 없다고 생각합니다. 여기하지만 영리한 해결 방법입니다 : http://blogs.msdn.com/b/avkashchauhan/archive/2011/10/23/retrieving-partition-key-range-in-windows-azure-table-storage.aspx

이 Avkash의 블로그에서 인용하자면 :

더 파고, 내가 파티션 키의 목록을 가져 API에 내장 더있다가 발견, 대신 내가 만들어야 할 것 나 자신을위한 해결책. 그래서 각 파티션에 하나의 더미 행을 넣었습니다. 파티션 키 목록을 얻으려고했는데 그 더미에 대해 항목 만 쿼리하면 찾고 있던 목록이 나에게 넘겨졌습니다.

난 당신이 이미 본 적이 있지만,이 질문에 발생할 수 있습니다 다른 사람에 대한 것이다 확신은,이 테이블 서비스 기능에 대한 최선의 가이드 생각 : 자세한 API 문서에 예제와 링크 http://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-tables/.

+7

이 접근 방식으로 전체 테이블 스캔이 이루어지지 않을까요? 더 나은 접근법은 각 파티션 (장치)에 대해 별도의 테이블을 만들거나 각 장치 (마스터 세부 접근법의 일종)에 대한 정보 만있는 테이블을 만드는 것입니다. –

+4

@ GauravMantri - 예, 전체 테이블 스캔이 발생할 수 있다고 생각합니다. 추가 테이블을 만들고 관리 할 때 오버 헤드를 줄이거 나 스캔을 수행하는 데 더 많은 오버 헤드가 필요한지, 아니면 사용 사례와 데이터 볼륨에 달려 있는지에 대한 질문입니다. 별도의 테이블은 필요 없지만 다른 파티션의 키를 가진 인덱스 파티션도 마찬가지입니다. – JcFx

+2

(현재) 모든 파티션을 반환 할 방법이 없습니다. 전체 테이블을 스캔하여 알아야합니다. 파티션 키를 계산하는 메타 데이터 또는 공통 알고리즘을 사용하십시오. – dunnry

2

유감스럽게도 Azure 테이블에는 고유 또는 기타 기능이 없습니다. 메모리에있는 사전과 같은 구조화 된 키 기반 저장소로 간주하십시오. 수행하는 모든 작업은 먼저로드 할 키를 알고 해당 하위 목록을 처리하지 않는 한 모든 항목을 반복하여 하위 항목을 가져와야합니다.

저는 개인적으로 두 번째 푸른 색 테이블을 사용하고 거기에 파티션 키를 (행 키로) 저장합니다. 그런 다음 다른 요소로 그룹화 할 수 있습니다. 또는이 두 번째 테이블에 단일 파티션 키를 사용하기 만하면됩니다.

이렇게하면 최고의 성능과 최소한의 두통을 줄 수 있습니다.

때로는 작업을 완료 할 때 가장 간단한 방법이 가장 좋습니다.

도움이 되었으면

11

파티션을 저장할 테이블을 하나 만듭니다. 사용하는 테이블 이름으로 테이블을 파티션하고 작성한 각 파티션에 대한 항목을 추가하십시오.

public class PartitionEntry : TableServiceEntity { } 

tableServiceContext.AddObject("TablePartitions", new PartitionEntry 
{ 
    PartitionKey = "<table name>", 
    RowKey = "<partition key>", 
}); 
tableServiceContext.BeginSaveChanges(SaveChangesOptions.ContinueOnError, null, null); 

는 단지 파티션의 목록을 얻으려면이 테이블을 쿼리합니다. 이것은 나에게 매우 관리하기 쉽습니다.

var tbl = tableServiceContext.CreateQuery<PartitionEntry>("TablePartitions"); 
return tbl.Where(i => i.PartitionKey == "<table name>") 
      .Select(i => new { PartitionKey = i.RowKey, }); 

이 방법을 최적화 할 수 있습니다. 이 병렬로 실행되는 becauwse

ConcurrentDictionary<string, byte> partitionKeys = new ConcurrentDictionary<string, byte>(); 
Parallel.ForEach(myTable.ExecuteQuery(new TableQuery()), entity => 
{ 
    partitionKeys.TryAdd(entity.PartitionKey, 0); 
}); 

당신은 큰 테이블이 경우에도 신속 채워야 :

0

이렇게하면 테이블의 모든 파티션 키의 목록을 얻을 것이다. "ConcurrentSet"이 없으므로 ConcurrentDictionary를 사용해야합니다. 바이트는 단지 자리 표시 자일뿐입니다. 모든 값은 partitionKeys.Keys에 있습니다.내가 함께 전에 유사한 접근을 시도

0

: (70 백만 행 테이블에 대해 실행 - 약 2 시간) 위뿐만 아니라 당신이 큰 매우 느린 동작으로

TableQuery queryRows = new TableQuery() { SelectColumns = new List<string> { "PartitionKey" } }; 
... 
var tableClientSrc = storageAcctScr.CreateCloudTableClient(); 
var tablesSrc = tableClientSrc.ListTables(); 
var tableSrc = tablesSrc.FirstOrDefault(o => o.Name.Equals(nameSrc)); 
int cntSrc = tableSrc.ExecuteQuery(queryRows).Count(); 
... 

또는 중간하지만, 많은 속성 테이블과

관련 문제