Hive View và Lập chỉ mục: Tạo với Ví dụ

⚡ Tóm tắt thông minh

Trong Hive, Views là các truy vấn đã được lưu, hoạt động giống như các bảng chỉ đọc, trong khi Index là các con trỏ đến một cột giúp tăng tốc độ tìm kiếm, và cả hai đều được tạo bằng các câu lệnh HiveQL ngắn gọn như được hiển thị ở đây.

  • 🇧🇷 Quan điểm này rất hợp lý: Một view chỉ lưu trữ câu lệnh SELECT của nó trong metastore, do đó nó không chiếm dung lượng đĩa riêng.
  • 🔒 Theo thiết kế, chỉ đọc: Một view không thể là mục tiêu của các lệnh LOAD, INSERT hoặc ALTER, vì Hive đánh giá lại view đó mỗi khi có truy vấn mới.
  • 📍 Chỉ số tham chiếu đến dữ liệu: Chỉ mục là một con trỏ trỏ đến giá trị cột, cho phép Hive đọc một phần của tệp thay vì toàn bộ bảng.
  • 🗂️ Hai người xử lý: Lập chỉ mục nhỏ gọn phù hợp với các cột có số lượng giá trị khác nhau cao, trong khi lập chỉ mục dạng bitmap phù hợp với các cột có ít giá trị khác nhau.
  • 🔄 Lắp ráp lại thủ công: Chỉ mục không bao giờ được làm mới tự động, vì vậy lệnh ALTER INDEX REBUILD phải được chạy sau khi bảng cơ sở được thay đổi.
  • 🚫 Đã bị loại bỏ trong Hive 3.0: Việc lập chỉ mục đã bị loại bỏ theo bản cập nhật HIVE-18448, và thay vào đó là các chế độ xem vật lý, lưu trữ ORC hoặc Parquet và phân vùng.

Giải thích về Views và Index trong Hive kèm ví dụ.

Chế độ xem là gì?

Các view tương tự như các bảng, và chúng được tạo ra dựa trên các yêu cầu. Một view là một đối tượng thuần túy logic, không có bộ nhớ riêng: Hive chỉ lưu giữ văn bản truy vấn trong metastore và đánh giá nó mỗi khi view được tham chiếu.

  • Chúng tôi có thể lưu bất kỳ dữ liệu tập kết quả nào dưới dạng chế độ xem trong Hive
  • Cách sử dụng tương tự như các view được sử dụng trong SQL
  • View chỉ có thể đọc dữ liệu, do đó nó không thể là đối tượng của các câu lệnh LOAD, INSERT hoặc ALTER ghi dữ liệu.

Tạo chế độ xem:

Cú pháp:

Create VIEW <VIEWNAME> AS SELECT

Biểu mẫu đầy đủ được ghi lại cũng chấp nhận mệnh đề IF NOT EXISTS và danh sách cột tùy chọn, điều này hữu ích khi danh sách SELECT chứa các biểu thức thay vì chỉ là tên cột thông thường.

Ví dụ:

Hive>Create VIEW Sample_View AS SELECT * FROM employees WHERE salary>25000

Trong ví dụ này, chúng ta tạo view Sample_View, hiển thị tất cả các giá trị hàng có trường lương lớn hơn 25000. Bộ lọc nằm bên trong view, vì vậy bất kỳ truy vấn nào chọn dữ liệu từ Sample_View chỉ thấy những hàng đó.

Chỉ mục là gì?

Chỉ mục là các con trỏ trỏ đến tên cột cụ thể của một bảng. Mục tiêu của chỉ mục là cải thiện tốc độ tìm kiếm: nếu không có chỉ mục, một truy vấn với mệnh đề điều kiện như... WHERE tab1.col1 = 10 Thao tác này tải toàn bộ bảng hoặc phân vùng và xử lý mọi hàng, trong khi chỉ mục trên cột 1 cho phép Hive chỉ đọc một phần của tập tin.

  • Người dùng phải xác định chỉ mục theo cách thủ công
  • Bất cứ khi nào chúng ta tạo chỉ mục, điều đó có nghĩa là chúng ta đang tạo một con trỏ đến tên cột cụ thể của bảng.
  • Mọi thay đổi được thực hiện đối với cột trong bảng đều được lưu trữ bằng cách sử dụng giá trị chỉ mục được tạo trên tên cột.

Việc tăng tốc đó không phải là miễn phí. Việc xây dựng chỉ mục tốn thêm tài nguyên xử lý, và bản thân chỉ mục chiếm dung lượng ổ đĩa cần được duy trì song song với bảng dữ liệu.

Cú pháp:

Create INDEX <INDEX_NAME> ON TABLE <TABLE_NAME(column names)>

Ví dụ:

Create INDEX sample_Index ON TABLE guruhive_internaltable(id)

Ở đây, chúng ta đang tạo một chỉ mục trên bảng guruhive_internaltable cho cột có tên là id. Lưu ý rằng một câu lệnh hoàn chỉnh trên phiên bản vẫn hỗ trợ lập chỉ mục cũng cần một mệnh đề xử lý chỉ mục, điều mà phần tiếp theo sẽ trình bày đầy đủ.

Sự khác biệt giữa View và Index trong Hive

Các view và index thường được giới thiệu cùng nhau vì cả hai đều nằm trên một bảng hiện có, nhưng chúng giải quyết các vấn đề khác nhau. View thay đổi những gì truy vấn nhìn thấy, trong khi index thay đổi tốc độ Hive tìm thấy nó. Bảng dưới đây so sánh chúng.

Yếu tố Xem Chỉ số
Nó lưu trữ những gì Chỉ có câu lệnh SELECT trong metastore. Một bảng chỉ mục riêng biệt chứa các con trỏ đến dữ liệu.
Mục đích Đơn giản hóa hoặc giới hạn những gì truy vấn trả về. Giảm lượng dữ liệu được quét cho một vị ngữ
Chi phí đĩa Không áp dụng Thêm dung lượng lưu trữ cộng với việc khôi phục lại sau khi dữ liệu thay đổi.
Ghi truy cập Chỉ đọc Không được truy vấn trực tiếp; trình tối ưu hóa sử dụng nó.
Tình trạng hiện tại Được hỗ trợ đầy đủ Đã bị loại bỏ trong Hive 3.0

Trên thực tế, một view được tạo ra để dễ đọc và kiểm soát truy cập, còn một index được tạo ra hoàn toàn vì hiệu suất trên một cột được chọn lọc.

Các loại chỉ mục trong Hive kèm cú pháp

Các phiên bản Hive đến 2.x đều có hai trình xử lý chỉ mục, và trình xử lý này được nêu tên trong mệnh đề AS bắt buộc. Tính năng lập chỉ mục nhỏ gọn xuất hiện trong Hive 0.7.0 và lập chỉ mục bitmap trong Hive 0.8.0.

  • Mục lục rút gọn: Phương pháp này lưu trữ giá trị cùng với địa chỉ của khối HDFS chứa giá trị đó, thay vì ghi lại vị trí của từng lần xuất hiện riêng lẻ. Nó phù hợp với các cột có nhiều giá trị khác nhau.
  • Chỉ mục ảnh bitmap: Lưu trữ một bitmap cho mỗi giá trị khác nhau, đây là cách tiếp cận thông thường đối với một cột chỉ có một số lượng nhỏ các giá trị khác nhau, chẳng hạn như trạng thái hoặc giới tính.

Một chỉ mục thu gọn được tạo, liệt kê và xóa như sau:

CREATE INDEX table01_index ON TABLE table01 (column2) AS 'COMPACT';
SHOW INDEX ON table01;
DROP INDEX table01_index ON table01;

Tùy chọn WITH DEFERRED REBUILD đăng ký chỉ mục mà không điền dữ liệu vào đó, do đó quá trình xây dựng có thể được lên lịch riêng bằng lệnh ALTER INDEX. Chỉ mục bitmap được tạo theo cách tương tự, với tên trình xử lý khác:

CREATE INDEX table03_index ON TABLE table03 (column4) AS 'BITMAP' WITH DEFERRED REBUILD;
ALTER INDEX table03_index ON table03 REBUILD;
SHOW FORMATTED INDEX ON table03;
DROP INDEX table03_index ON table03;

Chỉ mục không được làm mới tự động. Bất cứ khi nào bảng cơ sở nhận được dữ liệu mới, lệnh ALTER INDEX … REBUILD phải được chạy lại, và trên bảng được phân vùng, việc xây dựng lại có thể bị giới hạn ở một phân vùng duy nhất.

Vì sao tính năng lập chỉ mục bị loại bỏ trong Hive 3.0?

Chức năng lập chỉ mục đã bị loại bỏ khỏi Hive trong phiên bản 3.0 theo bản vá HIVE-18448, do đó các lệnh CREATE INDEX, SHOW INDEX và DROP INDEX không còn tồn tại trên cụm máy chủ hiện tại. Tính năng này hiếm khi đáng để xây dựng lại sau khi phương pháp lưu trữ theo cột và trình tối ưu hóa dựa trên chi phí đã được hoàn thiện. Ba lệnh thay thế này đều thực hiện cùng một nhiệm vụ.

  • Các khung nhìn được vật chất hóa: được giới thiệu trong Hive 3.0.0, một quan điểm vật chất Nó lưu trữ kết quả đã được tính toán trước của một truy vấn và trình tối ưu hóa sẽ tự động viết lại các truy vấn đến dựa trên kết quả đó.
  • Định dạng tệp dạng cột: ORC và Parquet có các chỉ mục nhẹ và thống kê min/max riêng, do đó trình đọc có thể bỏ qua toàn bộ các dải, khối hoặc tệp mà không cần chỉ mục do người dùng định nghĩa.
  • Phân vùng và thùng chứa: phân vùng và nhóm Cắt tỉa dữ liệu ở cấp độ thư mục và tệp, điều này thường loại bỏ nhiều dữ liệu đầu vào hơn so với việc lập chỉ mục.

Trên Hive 2.x, chỉ mục vẫn hợp lệ, nhưng các công việc mới sẽ hiệu quả hơn nếu sử dụng một trong các tùy chọn nêu trên.

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

Lệnh DROP VIEW view_name xóa view đó, và lệnh ALTER VIEW view_name RENAME TO new_name đổi tên view đó. Vì view không chứa dữ liệu, nên lệnh DROP sẽ xóa view_name.ping Không ai động đến bảng cơ sở; chỉ có mục nhập metastore biến mất.

Một materialized view lưu trữ kết quả truy vấn đã được tính toán trước dưới dạng dữ liệu thực, do đó nó tốn dung lượng ổ đĩa và cần phải REBUILD. Một view thông thường chỉ lưu trữ văn bản truy vấn và được tính toán lại mỗi khi được tham chiếu.

Không. Metastore chỉ giữ lại câu lệnh SELECT và danh sách cột đã được xử lý, không hơn không kém. Mỗi tham chiếu đều chạy lại truy vấn cơ bản, đó là lý do tại sao một view trên một join chậm vẫn chậm.

Trong Hive 0.12.0 trở xuống, tên chỉ mục phân biệt chữ hoa chữ thường đối với CREATE INDEX và DROP INDEX, trong khi ALTER INDEX cần chữ thường. Hive 0.13.0 đã loại bỏ sự phân biệt chữ hoa chữ thường trong tên chỉ mục cho mọi câu lệnh.

Đúng vậy, trên bất kỳ cụm máy chủ hiện đại nào. Việc loại bỏ phân vùng (partition pruning) sẽ xóa toàn bộ thư mục trước khi quá trình quét bắt đầu, còn việc phân nhóm (bucketing) sẽ thu hẹp phạm vi tìm kiếm hoặc lấy mẫu xuống các tệp cụ thể, điều này thường mang lại hiệu quả tốt hơn so với việc chỉ sử dụng bảng chỉ mục.

Các công cụ học máy phân tích nhật ký truy vấn, xếp hạng các cột điều kiện theo độ chọn lọc và tần suất, và đề xuất nơi mà chế độ xem vật chất hóa hoặc lược đồ phân vùng sẽ mang lại hiệu quả. Xác thực từng đề xuất dựa trên kế hoạch EXPLAIN trước khi áp dụng.

Nó tạo ra các câu lệnh CREATE VIEW một cách đáng tin cậy từ một đoạn chú thích ngắn. Hãy kiểm tra bất kỳ thông tin nào liên quan đến phiên bản, vì nó vẫn tạo ra cú pháp CREATE INDEX mà cụm Hive 3.0 trở lên từ chối hoàn toàn.

Mục lục là một bảng con trỏ riêng biệt, và Hive không bao giờ làm mới nó khi bảng cơ sở thay đổi. Nếu không xây dựng lại, các con trỏ sẽ trở nên lỗi thời, vì vậy trình tối ưu hóa sẽ bỏ qua mục lục hoặc trả về các kết quả khớp lỗi thời.

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