2012-10-12 12 views
8

Hiện tại tôi đang sử dụng PartitionKey để phân biệt các thiết bị đang lưu trữ dữ liệu vào Dịch vụ Bảng Azure. Tôi muốn xây dựng một trình xem cho phép tôi duyệt dữ liệu đó, nhưng thật tuyệt khi có thể cấu trúc nó để tôi có thể xem dữ liệu "theo thiết bị", hoặc bằng PartitionKey. Ứng dụng trình xem sẽ không có bất kỳ kiến ​​thức nào về những thiết bị tồn tại, vì vậy sẽ tuyệt vời nếu tôi bằng cách nào đó có thể lấy lại danh sách các PartionKey riêng biệt trong một Bảng đã cho. Điều này có thể, hoặc tôi sẽ bị xuống hạng để tạo một bảng siêu dữ liệu mà tôi chèn một hàng mới cho mỗi thiết bị, sau đó sử dụng nó để truy vấn?Có cách nào để nhận PartionKey riêng biệt từ một Bảng

Trả lời

6

Tôi không nghĩ rằng có một cách để truy xuất tất cả các phím phân vùng. Dưới đây là một cách giải quyết thông minh, mặc dù: http://blogs.msdn.com/b/avkashchauhan/archive/2011/10/23/retrieving-partition-key-range-in-windows-azure-table-storage.aspx

Để trích dẫn từ Avkash blog:

Đào hơn nữa, tôi tìm thấy ở đó không được xây dựng trong API để có được một danh sách các phím phân vùng, thay vào đó tôi sẽ phải tạo một giải pháp cho bản thân tôi. Vì vậy, tôi cuối cùng chèn một hàng giả duy nhất vào mỗi phân vùng và khi Tôi muốn nhận danh sách các phím phân vùng, tôi chỉ truy vấn cho các mục giả và chúng đã cho tôi danh sách tôi đang tìm kiếm.

Tôi chắc chắn bạn sẽ đã đã thấy điều này, nhưng đối với người khác có thể xảy ra về câu hỏi này, tôi nghĩ rằng đây là hướng dẫn tốt nhất để chức năng dịch vụ bảng: http://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-tables/ với các ví dụ và các liên kết đến các tài liệu API chi tiết.

+7

Cách tiếp cận này sẽ không dẫn đến quét toàn bộ bảng? Cách tiếp cận tốt hơn sẽ là tạo một bảng riêng cho mỗi Phân vùng (thiết bị) hoặc tạo một bảng chỉ có thông tin về từng thiết bị (loại phương pháp tiếp cận chi tiết chính). –

+4

@GauravMantri - Vâng, tôi nghĩ rằng nó có thể dẫn đến việc quét toàn bộ bảng. Tôi cho rằng đó là câu hỏi liệu bạn có muốn chi phí ít hơn trong việc tạo và quản lý một bảng bổ sung hay hiệu quả hơn trong việc thực hiện quét - điều này phụ thuộc vào trường hợp sử dụng của bạn và khối lượng dữ liệu. Tuy nhiên, bạn không cần một bảng riêng biệt - một phân vùng chỉ mục không có gì ngoài các khóa cho các phân vùng khác cũng sẽ làm như vậy. – JcFx

+2

Không có cách nào để trả về tất cả các phân vùng (hôm nay). Bạn sẽ phải quét toàn bộ bảng để biết. Sử dụng siêu dữ liệu hoặc thuật toán phổ biến để tính toán khóa phân vùng nào. – dunnry

2

Rất tiếc, Azure Tables không có các chức năng như khác biệt hoặc những người khác - coi đó là bộ nhớ dựa trên khóa có cấu trúc như một từ điển trong bộ nhớ. Bất kỳ thao tác nào bạn thực hiện, sẽ phải lặp qua tất cả các mục để nhận được một tập hợp con của chúng trừ khi biết bạn muốn tải khóa nào trước và xử lý danh sách phụ đó.

Tôi cá nhân, chỉ cần sử dụng một bảng màu xanh thứ hai và lưu trữ các khóa phân vùng ở đó (dưới dạng khóa hàng), sau đó cung cấp cho bạn cơ hội nhóm các yếu tố này theo một yếu tố khác. Hoặc chỉ cần sử dụng một khóa phân vùng duy nhất cho bảng thứ hai này.

Điều này sẽ mang đến cho bạn hiệu suất tốt nhất và ít nhất là nhức đầu.

Đôi khi, cách tiếp cận đơn giản nhất là cách tốt nhất vì bạn có thể hoàn thành công việc.

Hy vọng điều này sẽ giúp,

11

Tạo một bảng duy nhất để lưu trữ phân vùng của bạn. Phân vùng bảng theo tên bảng bạn sử dụng và thêm mục nhập cho mỗi phân vùng bạn tạo.

public class PartitionEntry : TableServiceEntity { } 

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

sau đó chỉ cần truy vấn bảng này để nhận danh sách phân vùng. Điều này rất dễ quản lý với tôi.

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

Tôi đặt cược điều này có thể được tối ưu hóa.

0

Điều này sẽ giúp bạn có được một danh sách tất cả các phím phân vùng trong bảng của bạn:

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

Thậm chí nếu bạn có một bảng lớn thì nên cư nhanh chóng becauwse nó đang chạy song song. Không có "ConcurrentSet", nếu bạn muốn, vì vậy chúng tôi phải sử dụng ConcurrentDictionary. Byte chỉ là một trình giữ chỗ; tất cả các giá trị sẽ nằm trong partitionKeys.Keys.

0

tôi đã cố gắng tiếp cận tương tự trước với:

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(); 
... 

trên cũng như của bạn làm việc rất chậm trên lớn (chạy cho 70 triệu đô la hàng bảng - khoảng 2 giờ) hoặc trung bình nhưng với bảng nhiều tài sản

Các vấn đề liên quan