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
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.
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,
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.
Đ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.
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
- 1. Làm cách nào để kết hợp dữ liệu từ hai bảng riêng biệt vào một Con trỏ đơn?
- 2. Django - nhận các ngày riêng biệt từ dấu thời gian
- 3. Nhận các hàng riêng biệt từ một kết nối bên ngoài bên trái
- 4. Nhận các mục riêng biệt từ danh sách
- 5. Làm cách nào để có được danh sách các tên riêng biệt, được sắp xếp từ một DataTable bằng LINQ?
- 6. Có nên có một bảng riêng biệt khi ánh xạ từ một đến nhiều mối quan hệ không?
- 7. giới hạn từ khóa riêng biệt thành một cột
- 8. Mysqldumper: Dumping mỗi bảng riêng biệt
- 9. Làm cách nào để xử lý tin nhắn cửa sổ từ một chuỗi riêng biệt?
- 10. cấu trúc bảng mysql - một bảng rất lớn hoặc các bảng riêng biệt?
- 11. Chọn một giá trị riêng biệt trong nhiều bảng (sql)
- 12. Chọn các hàng riêng biệt từ MongoDB
- 13. MySQL: Cách tính từ các cột riêng biệt?
- 14. Chọn các giá trị riêng biệt từ nhiều cột trong cùng một bảng
- 15. Thiết kế cơ sở dữ liệu: một bảng lớn hoặc bảng riêng biệt?
- 16. Làm cách nào để chọn các giá trị khác biệt từ một cột trong bảng?
- 17. Ba địa chỉ khách hàng trong một bảng hoặc trong các bảng riêng biệt?
- 18. SQL: Cách nhận được số lượng của mỗi giá trị riêng biệt trong một cột?
- 19. Cách nhận các biến & lng dưới dạng các biến riêng biệt từ mapCenter
- 20. chọn các mục riêng biệt từ một cột trong powershell
- 21. Cách ghi nhật ký từ một dịch vụ vào một tệp riêng biệt?
- 22. Td chiều cao trên hai bảng riêng biệt
- 23. Làm thế nào để xác định một `từ ... import * 'api riêng biệt từ __all__ trong một mô-đun?
- 24. Làm cách nào để tạo một đoạn mã chạy trong một chuỗi riêng biệt?
- 25. Câu riêng biệt cho một từ trên mỗi dòng
- 26. Tại sao có một thông điệp riêng biệt cho WM_ERASEBKGND
- 27. Làm cách nào để nhận được nhiều giá trị cao nhất từ một bảng?
- 28. Truy vấn hai bảng trong cơ sở dữ liệu riêng biệt trên cùng một máy chủ
- 29. Cách nhận các ứng dụng Django riêng biệt trên cùng một tên miền phụ để chia sẻ cookie phiên?
- 30. Làm cách nào để lưu tệp vào đĩa cứng trong một chuỗi riêng biệt?
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). –
@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
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