Ví dụ truy vấn HBase: Các lệnh put(), get() và scan()

⚡ Tóm tắt thông minh

Các lệnh put, get và scan của HBase là các lệnh cốt lõi để ghi và đọc dữ liệu, cho phép bạn lưu trữ giá trị ô theo hàng và cột, lấy một hàng duy nhất hoặc duyệt nhiều hàng từ giao diện dòng lệnh. Java API.

  • 🇧🇷 Viết bằng lệnh put: Lệnh put lưu trữ một giá trị tại bảng, hàng, cột và dấu thời gian (tùy chọn).
  • 🔍 Đọc với get: Lệnh get trả về một hàng hoặc một ô duy nhất, kèm theo các tùy chọn TIMERANGE, VERSIONS và FILTERS.
  • 📜 Tìm kiếm bằng cách quét: Lệnh scan liệt kê nhiều hàng và giá trị cột tương ứng trong một bảng.
  • Java API: Các hoạt động tương tự được thực hiện trong Java Sử dụng các phương thức Put, Get, Scan và lớp hỗ trợ Bytes.
  • 🧬 Tọa độ: Mỗi giá trị được xác định bằng khóa hàng, nhóm cột và định danh cột.
  • 🤖 Hỗ trợ AI: Các trợ lý AI soạn thảo, lấy và quét mã, đồng thời đề xuất các thiết kế khóa hàng hiệu quả.

Các lệnh truy vấn HBase put(), get() và scan() trong shell và Java

Ghi dữ liệu vào bảng HBase: Shell

Các ví dụ này giả định rằng HBase là đã được cài đặt và đang chạy, cửa sổ dòng lệnh HBase đang mở và một bảng có tên guru99 Đã tồn tại với các nhóm chuyên gia về giáo dục và các dự án.

Lệnh `put` được sử dụng để lưu trữ dữ liệu vào một bảng.

Syntax:  put <'tablename'>,<'rowname'>,<'columnvalue'>,<'value'>

Lệnh này được sử dụng cho các mục đích sau:

  • Nó sẽ đặt một 'giá trị' của ô vào một bảng hoặc hàng hoặc cột được xác định hoặc chỉ định.
  • Nó sẽ tùy chọn phối hợp việc ghi lại dấu thời gian.

Ví dụ, ở đây chúng ta đang nhập các giá trị vào bảng “guru99” ở hàng r1 và cột c1:

hbase> put 'guru99', 'r1', 'c1', 'value', 10

Chúng tôi đã nhập ba giá trị 10, 15 và 30 vào bảng “guru99”, như thể hiện trong ảnh chụp màn hình bên dưới.

Lệnh `put` trong HBase shell chèn các giá trị 10, 15 và 30 vào bảng guru99.

Giả sử bảng “guru99” có một tham chiếu bảng, chẳng hạn như g. Bạn cũng có thể chạy lệnh trên tham chiếu bảng như sau:

hbase> g.put 'guru99', 'r1', 'c1', 'value', 10

Kết quả hiển thị như trong ảnh chụp màn hình phía trên sau khi nhập giá trị vào “guru99”.

Đọc dữ liệu từ bảng HBase: Shell

Trong phần này, chúng ta sẽ kiểm tra những điều sau đây: Vỏ HBase:

  • Các giá trị được chèn vào bảng HBase “guru99”.
  • Tên cột với các giá trị hiện có trong bảng HBase guru99.

Kết quả quét bên dưới liệt kê mọi giá trị được chèn vào "guru99", cùng với tên hàng và cột tương ứng:

Hiển thị kết quả đầu ra của lệnh quét shell HBase, liệt kê các hàng và giá trị cột trong bảng guru99.

Từ ảnh chụp màn hình trên, ta có thể suy ra những điều sau:

  • Nếu ta chạy lệnh “scan” trong HBase shell, nó sẽ hiển thị các giá trị đã được chèn vào “guru99” như sau.
  • Trong cửa sổ dòng lệnh HBase, nó sẽ hiển thị các giá trị được chèn bởi mã của chúng ta, cùng với tên cột và tên hàng.
  • Ở đây, chúng ta có thể thấy tên các cột được chèn vào là “giáo dục” và “dự án”.
  • Các giá trị được chèn vào các cột đã đề cập là “BigData” và “HBase Tutorials”.

Bạn cũng có thể sử dụng lệnh get để đọc dữ liệu từ một bảng.

Syntax: get <'tablename'>, <'rowname'>, {< Additional parameters>}

Ở đây, các tham số bổ sung bao gồm TIMESTAMP, TIMESTAMP, VERSIONS và FILTERS. Sử dụng lệnh này, bạn sẽ nhận được một hàng hoặc nội dung ô có trong bảng. Bạn có thể thêm các tham số bổ sung, chẳng hạn như TIMESTAMP, TIMERANGE, VERSIONS hoặc FILTERS, để lấy một hàng hoặc nội dung ô cụ thể. Bảng dưới đây tóm tắt các tham số này:

Tham số Mục đích
KHOẢNG THỜI GIAN Trả về các ô có dấu thời gian nằm trong khoảng thời gian bắt đầu và kết thúc.
THỜI GIAN Chỉ trả về phiên bản ô được lưu trữ tại một thời điểm chính xác.
PHIÊN BẢN Thiết lập số lượng phiên bản của một ô cần trả về (mặc định là 1).
LỌC Áp dụng bộ lọc để giới hạn các hàng hoặc cột được trả về.
CỘT Giới hạn kết quả chỉ trong các nhóm cột hoặc bộ lọc cụ thể.

Dưới đây là một số ví dụ minh họa về lệnh get:

hbase> get 'guru99', 'r1', {COLUMN => 'c1'}

Đối với bảng “guru99”, các giá trị ở hàng r1 và cột c1 sẽ được hiển thị bằng lệnh này, như trong ảnh chụp màn hình bên dưới.

Lệnh get trong HBase shell trả về một hàng duy nhất r1 từ bảng guru99.

hbase> get 'guru99', 'r1'

Đối với bảng “guru99”, các giá trị ở hàng r1 sẽ được hiển thị bằng lệnh này.

hbase> get 'guru99', 'r1', {TIMERANGE => [ts1, ts2]}

Đối với bảng “guru99”, các giá trị ở hàng r1 trong khoảng thời gian từ ts1 đến ts2 sẽ được hiển thị bằng lệnh này.

hbase> get 'guru99', 'r1', {COLUMN => ['c1', 'c2', 'c3']}

Đối với bảng “guru99”, các giá trị của hàng r1 và các nhóm cột c1, c2 và c3 sẽ được hiển thị bằng lệnh này.

Ghi dữ liệu vào bảng HBase: API JAVA

Ở bước này, chúng ta sẽ ghi dữ liệu vào bảng HBase “guru99”.

Đầu tiên, chúng ta phải viết mã để chèn và truy xuất giá trị từ HBase, sử dụng chương trình HBaseLoading.java. Để tạo và chèn giá trị vào bảng ở cấp độ cột, bạn sẽ viết mã như được hiển thị bên dưới.

Ảnh chụp màn hình bên dưới hiển thị Java Đoạn mã xây dựng cấu hình HBase và chèn giá trị vào “guru99”:

Java Đoạn mã tạo cấu hình HBase và chèn giá trị bằng API Put.

Từ ảnh chụp màn hình phía trên:

  • Khi chúng ta tạo cấu hình HBase, nó sẽ trỏ đến bất kỳ cấu hình nào chúng ta đã thiết lập trong các tệp hbase-site.xml và hbase-default.xml trong quá trình cài đặt HBase.
  • Tạo bảng “guru99” bằng phương thức HTable.
  • Thêm hàng 1 vào bảng “guru99”.
  • Chỉ định tên cột là “giáo dục” và “dự án” và chèn giá trị vào các tên cột tương ứng trong hàng 1. Các giá trị được chèn ở đây là BigData và “HBaseTutorials”.

Đọc dữ liệu từ bảng HBase: Java API

Bất kỳ giá trị nào chúng ta đã nhập vào bảng HBase ở phần trên, ở đây chúng ta sẽ truy xuất và hiển thị các giá trị đó.

Dưới đây là kết quả hiển thị trên bảng điều khiển cho thấy dữ liệu được đọc lại từ bảng HBase “guru99”:

Java Hiển thị kết quả đầu ra trên bảng điều khiển khi đọc các giá trị cột "giáo dục và dự án" từ bảng HBase "guru99".

Để truy xuất kết quả được lưu trữ trong “guru99”:

  • Ở đây, chúng ta sẽ truy xuất các giá trị được lưu trữ trong các nhóm cột, cụ thể là "giáo dục" và "dự án".
  • Sử dụng lệnh “get”, chúng ta sẽ truy xuất các giá trị được lưu trữ trong bảng HBase.
  • Quét kết quả bằng lệnh “scan”. Các giá trị được lưu trữ trong hàng 1 sẽ hiển thị trên bảng điều khiển.

Sau khi viết xong mã, bạn chạy nó. Java ứng dụng như thế này:

Nhấp chuột phải vào HBaseLoading.java -> Chạy với quyền -> Java Ứng dụng.

Sau khi chạy chương trình “HBaseLoading.java”, các giá trị sẽ được chèn vào biến “guru99” trong mỗi cột của HBase, và chương trình này cũng có thể truy xuất các giá trị đó.

Đây là mã hoàn chỉnh:

import java.io.IOException;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;
public class HBaseLoading
{
public static void main(String[] args) throws IOException
{
/* When you create a HBaseConfiguration, it reads in whatever you've set into your hbase-site.xml and in hbase-default.xml, as long as these can be found on the CLASSPATH*/

org.apache.hadoop.conf.Configuration config = HBaseConfiguration.create();

/*This instantiates an HTable object that connects you to the "test" table*/

HTable table = new HTable(config, "guru99");

/* To add to a row, use Put. A Put constructor takes the name of the row you want to insert into as a byte array.*/

Put p = new Put(Bytes.toBytes("row1"));

/*To set the value you'd like to update in the row 'row1', specify the column family, column qualifier, and value of the table cell you'd like to update. The column family must already exist in your table schema. The qualifier can be anything.*/

p.add(Bytes.toBytes("education"), Bytes.toBytes("col1"),Bytes.toBytes("BigData"));
p.add(Bytes.toBytes("projects"),Bytes.toBytes("col2"),Bytes.toBytes("HBaseTutorials"));

// Once you've adorned your Put instance with all the updates you want to make, to commit it do the following

table.put(p);

// Now, to retrieve the data we just wrote.

Get g = new Get(Bytes.toBytes("row1"));
Result r = table.get(g);

byte [] value = r.getValue(Bytes.toBytes("education"),Bytes.toBytes("col1"));
byte [] value1 = r.getValue(Bytes.toBytes("projects"),Bytes.toBytes("col2"));
String valueStr = Bytes.toString(value);

String valueStr1 = Bytes.toString(value1);
System.out.println("GET: " +"education: "+ valueStr+"projects: "+valueStr1);

Scan s = new Scan();

s.addColumn(Bytes.toBytes("education"), Bytes.toBytes("col1"));
s.addColumn(Bytes.toBytes("projects"), Bytes.toBytes("col2"));
ResultScanner scanner = table.getScanner(s);
try
{
for (Result rr = scanner.next(); rr != null; rr = scanner.next())
{
System.out.println("Found row : " + rr);
}
} finally
{
// Make sure you close your scanners when you are done!

scanner.close();
}
}
}

Lưu ý về các phiên bản API: Ví dụ trên sử dụng lớp HTable và phương thức add() của nó, phản ánh API máy khách HBase cũ hơn. Từ HBase 1.0 trở đi, HTable đã bị loại bỏ. Mã hiện đại lấy một Table thông qua ConnectionFactory.createConnection(…).getTable(…) và xây dựng một Put với addColumn() thay vì add(). Logic của put, get và scan vẫn giữ nguyên.

Câu Hỏi Thường Gặp

Lệnh `get` truy xuất một hàng dựa trên khóa hàng của nó và trả về kết quả nhanh chóng. Lệnh `scan` đọc nhiều hàng tuần tự trên toàn bộ bảng hoặc một phạm vi khóa, có thể lọc theo cột hoặc thời gian. Sử dụng `get` để tra cứu một hàng duy nhất và `scan` để duyệt hoặc xuất nhiều hàng.

Nhóm cột (column family) là một nhóm các cột được đặt tên, được lưu trữ cùng nhau và được định nghĩa khi bạn tạo bảng. Bộ định danh cột (column qualifier) ​​là tên của từng cột riêng lẻ bên trong nhóm đó, ví dụ như education:col1. Các nhóm cột phải tồn tại trong lược đồ; bộ định danh có thể được thêm vào tự do trong quá trình ghi dữ liệu.

Sử dụng lệnh delete để xóa một ô, ví dụ: delete 'guru99', 'r1', 'c1'. Sử dụng deleteall để xóa toàn bộ một hàng: deleteall 'guru99', 'r1'. Để xóa trắng hoàn toàn một bảng, hãy vô hiệu hóa bảng đó, sau đó chạy lệnh truncate 'guru99', lệnh này sẽ xóa và tạo lại bảng.

HBase lưu giữ nhiều phiên bản có dấu thời gian của mỗi ô. Số lượng phiên bản được giữ lại được thiết lập cho mỗi nhóm cột bởi thuộc tính VERSIONS, mặc định là 1. Thêm {VERSIONS => 3} vào lệnh get hoặc scan để trả về nhiều phiên bản, hoặc thêm TIMESTAMP để lấy một phiên bản chính xác.

Chạy lệnh `list` để xem tất cả các bảng trong HBase. Chạy lệnh `count 'guru99'` để đếm số hàng trong một bảng, có thể thêm khoảng thời gian (INTERVAL) để theo dõi tiến trình. Sử dụng lệnh `describe 'guru99'` để xem các nhóm cột (column families) và lệnh `status 'simple'` để kiểm tra trạng thái của cụm.

HBase không có SQL gốc, nhưng Apache Phoenix bổ sung một lớp SQL giúp biên dịch các truy vấn thành các thao tác put, get và scan gốc. Nó hỗ trợ cú pháp SELECT, UPSERT và JOIN quen thuộc, giúp việc truy vấn HBase dễ dàng hơn đối với các nhóm đã thông thạo SQL.

Các trợ lý lập trình AI và các mô hình ngôn ngữ lớn có thể soạn thảo các lệnh shell HBase và Java Mã phía máy khách được tạo từ lời nhắc bằng ngôn ngữ đơn giản, đề xuất thiết kế khóa hàng và giải thích các bộ lọc quét. Học máy cũng giúp điều chỉnh hiệu suất bằng cách dự đoán các vùng hoạt động nóng, mặc dù kỹ sư nên xác minh mọi truy vấn được tạo ra.

Vâng. Trợ lý GitHub có thể tạo các đoạn mã put, get và scan của HBase trong Java hoặc đoạn mã từ một bình luận ngắn, bao gồm các lệnh gọi Bytes.toBytes và các bộ lọc Scan. RevHãy xem kết quả đầu ra để đảm bảo tên bảng, nhóm cột và API bảng hiện tại chính xác trước khi chạy.

Tóm tắt bài viết này với: