2009-09-16 39 views
8

Với kịch bản giản đồ HBase sau (from the official FAQ) ...truy vấn nâng cao trong HBase

Làm thế nào bạn sẽ thiết kế một bảng HBase cho nhiều-nhiều mối liên hệ giữa hai thực thể, ví dụ sinh viên và Khóa học?

tôi sẽ xác định hai bảng:

Sinh viên: dữ liệu học sinh sinh viên id (tên, địa chỉ, ...) các khóa học (sử dụng id nhiên như vòng loại cột ở đây)

khóa học: Khóa học id nhiên dữ liệu (tên, giáo trình, ...) học sinh (sinh viên sử dụng id như vòng loại cột ở đây)

schema này cho phép bạn để truy cập nhanh các truy vấn, hiển thị tất cả các lớp học cho một sinh viên (s bảng tudent, các khóa học gia đình), hoặc tất cả học sinh cho một lớp học (bảng khóa học, gia đình học sinh).

Bạn đáp ứng yêu cầu như thế nào: "Hãy cho tôi tất cả học sinh chia sẻ ít nhất hai khóa học phổ biến"? Bạn có thể xây dựng một "truy vấn" trong HBase mà sẽ trả về tập hợp đó, hay bạn phải lấy tất cả dữ liệu thích hợp và tự xiết nó trong mã?

Trả lời

3

Truy vấn được mô tả phù hợp hơn với cơ sở dữ liệu quan hệ. Bạn có thể trả lời truy vấn một cách nhanh chóng, tuy nhiên, bằng cách precomputing kết quả. Ví dụ, bạn có thể có một bảng trong đó khóa là số lượng các lớp chung, và các ô là các sinh viên riêng lẻ có nhiều lớp chung.

Bạn có thể sử dụng biến thể để trả lời các câu hỏi như "học sinh ở lớp X và lớp Y": sử dụng các lớp như phần của khóa (theo thứ tự bảng chữ cái hoặc ít nhất là nhất quán), và một lần nữa, mỗi cột là một sinh viên.

2

Loại truy vấn này không có sẵn thông qua API 0.20.0. Tôi không chắc chắn nếu có bất kỳ kế hoạch cho nó (tôi nghi ngờ nó sẽ xuất hiện bất cứ lúc nào sớm). Bạn sẽ tìm thấy một số chi tiết lộ trình trên trang web HBase mà có thể trả lời câu hỏi đó.

Bạn sẽ cần tính toán câu trả lời trong ứng dụng của riêng mình (mặc dù tôi rất muốn được chứng minh là sai).

1

Sử dụng bộ lọc để đạt được điều này.

SingleValueFiler filer = new SingleValueFiler (và đối số của bạn dựa trên api);

thêm video này vào Quét (org.apache.hadoop.hbase.client.Scan quét = new Scan(); scan.setFiler (lọc);

+0

Bạn có thể mở rộng trên mã giả ví dụ của bạn kết hợp các sinh viên/khóa học từ câu hỏi để chứng minh làm thế nào một SingleValueFilter sẽ hoàn thành nhiệm vụ? –

1

Có vẻ như MapReduce có thể là một cách để giải quyết này; Thật không may nó sẽ không cho kết quả tức thì nếu nó được thực hiện một cách nhanh chóng Chỉ cần suy nghĩ qua nó, bạn có thể, trong giai đoạn bản đồ, đếm số lần một cặp sinh viên kết thúc trong cùng một lớp. bạn có thể tổng hợp các cặp và viết ra (phát ra) các cặp có tổng số từ 2 trở lên. Cách tiếp cận này có thể được sử dụng để tạo trước chỉ mục (như được đề xuất trước đó) cho biết các cặp sinh viên có các khóa học "x" chung.Chìa khóa để chỉ mục như vậy có thể là một cái gì đó dọc theo dòng của "X/Student1_Key/Student2_Key", trong đó X là số lượng các khóa học họ có chung và. Quét phạm vi trên chỉ mục (ví dụ: X> = 2) sẽ cho bạn câu trả lời của bạn. Do sự tích hợp bản địa của HBase với MapReduce, một giải pháp dọc theo các dòng này nên đơn giản.

Ngoài ra, theo mô hình BigTable, bạn thậm chí sẽ không cần tạo hai bảng. Chỉ cần đứng trước mỗi khóa bản ghi với một "loại" như Khóa học: hoặc Sinh viên :. Vì các hàng được sắp xếp theo thứ tự từ điển, chúng dễ dàng quét theo loại. Điền (hoặc tạo) các cột cần thiết để hỗ trợ các thuộc tính cho từng loại. Vì HBase hỗ trợ các bảng thưa thớt cao nên nó hoạt động tốt. Xem bản trình bày tuyệt vời này về cách chọn khóa và phát triển các chỉ mục với BigTable: http://www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html. Bài thuyết trình này thực sự giúp tôi hiểu cách lưu trữ những thứ trong cơ sở dữ liệu như HBase để thu hồi hiệu quả.

Nhưng quay lại câu hỏi ban đầu, có vẻ như khi làm việc với HBase bạn thực sự phải biết cách sử dụng dữ liệu của mình để các chỉ số thích hợp có thể được phát triển trước để có câu trả lời nhanh. Nó không xuất hiện mà các truy vấn ngẫu nhiên đặc biệt sẽ luôn luôn làm việc với mô hình này.

Dù sao, tôi cũng mới làm quen với vấn đề này và các giải pháp có thể hữu ích!

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