Hive View และการทำดัชนี: สร้างด้วยตัวอย่าง
⚡ สรุปอย่างชาญฉลาด
ใน Hive มุมมอง (Views) คือแบบสอบถามที่บันทึกไว้ซึ่งทำงานเหมือนตารางแบบอ่านอย่างเดียว ในขณะที่ดัชนี (Indexes) คือตัวชี้ไปยังคอลัมน์ที่ช่วยเพิ่มความเร็วในการค้นหา และทั้งสองอย่างสร้างขึ้นด้วยคำสั่ง HiveQL สั้นๆ ดังที่แสดงไว้ที่นี่

มุมมองคืออะไร?
วิวมีลักษณะคล้ายกับตาราง และถูกสร้างขึ้นตามความต้องการ วิวเป็นวัตถุเชิงตรรกะล้วนๆ โดยไม่มีการจัดเก็บข้อมูลของตัวเอง: Hive เก็บเฉพาะข้อความคำสั่งค้นหาไว้ใน metastore และประเมินผลทุกครั้งที่มีการอ้างอิงถึงวิว
- เราสามารถบันทึกข้อมูลชุดผลลัพธ์เป็นมุมมองใน Hive ได้
- วิธีการใช้งานคล้ายกับการใช้มุมมองใน SQL
- วิวเป็นแบบอ่านอย่างเดียว ดังนั้นจึงไม่สามารถเป็นเป้าหมายของคำสั่ง LOAD, INSERT หรือ ALTER ที่เขียนข้อมูลลงไปได้
การสร้างมุมมอง:
ไวยากรณ์:
Create VIEW <VIEWNAME> AS SELECT
รูปแบบเอกสารฉบับเต็มยังรองรับเงื่อนไข IF NOT EXISTS และรายการคอลัมน์เสริม ซึ่งมีประโยชน์เมื่อรายการ SELECT ประกอบด้วยนิพจน์แทนที่จะเป็นชื่อคอลัมน์ธรรมดา
ตัวอย่าง:
Hive>Create VIEW Sample_View AS SELECT * FROM employees WHERE salary>25000
ในตัวอย่างนี้ เรากำลังสร้างวิวชื่อ Sample_View ซึ่งแสดงค่าทุกแถวที่มีฟิลด์เงินเดือนมากกว่า 25000 ตัวกรองจะอยู่ภายในวิว ดังนั้นการค้นหาใดๆ ที่เลือกจาก Sample_View จะเห็นเฉพาะแถวเหล่านั้นเท่านั้น
ดัชนีคืออะไร?
ดัชนีคือตัวชี้ไปยังชื่อคอลัมน์เฉพาะของตาราง เป้าหมายของดัชนีคือการเพิ่มความเร็วในการค้นหา หากไม่มีดัชนี การค้นหาด้วยเงื่อนไขเช่น โดยที่ tab1.col1 = 10 การโหลดทั้งตารางหรือพาร์ติชันและประมวลผลทุกแถว ในขณะที่การสร้างดัชนีบนคอลัมน์ 1 จะทำให้ Hive อ่านได้เพียงบางส่วนของไฟล์เท่านั้น
- ผู้ใช้จะต้องกำหนดดัชนีด้วยตนเอง
- การสร้างดัชนีที่ใดก็ตาม หมายความว่าเรากำลังสร้างตัวชี้ไปยังชื่อคอลัมน์เฉพาะของตาราง
- การเปลี่ยนแปลงใดๆ ที่เกิดขึ้นกับคอลัมน์ในตารางจะถูกจัดเก็บโดยใช้ค่าดัชนีที่สร้างขึ้นบนชื่อคอลัมน์
ความเร็วที่เพิ่มขึ้นนั้นไม่ได้มาฟรีๆ การสร้างดัชนีต้องใช้การประมวลผลเพิ่มเติม และตัวดัชนีเองก็ใช้พื้นที่ดิสก์ซึ่งต้องได้รับการดูแลรักษาควบคู่ไปกับตารางด้วย
ไวยากรณ์:
Create INDEX <INDEX_NAME> ON TABLE <TABLE_NAME(column names)>
ตัวอย่าง:
Create INDEX sample_Index ON TABLE guruhive_internaltable(id)
ในที่นี้เรากำลังสร้างดัชนีบนตาราง guruhive_internaltable สำหรับคอลัมน์ชื่อ id โปรดทราบว่าคำสั่งที่สมบูรณ์ในเวอร์ชันที่ยังคงรองรับการสร้างดัชนีนั้นจำเป็นต้องมีส่วนคำสั่ง index-handler ด้วย ซึ่งส่วนถัดไปจะแสดงรายละเอียดทั้งหมด
ความแตกต่างระหว่าง View และ Index ใน Hive
มุมมอง (Views) และดัชนี (Indexs) มักถูกกล่าวถึงพร้อมกัน เนื่องจากทั้งสองอย่างทำงานอยู่บนตารางที่มีอยู่แล้ว แต่ทั้งสองอย่างแก้ปัญหาที่แตกต่างกัน มุมมองจะเปลี่ยนสิ่งที่คำสั่งค้นหาเห็น ในขณะที่ดัชนีจะเปลี่ยนความเร็วในการค้นหาของ Hive ตารางด้านล่างนี้เปรียบเทียบทั้งสองอย่าง
| แง่มุม | รายละเอียด | ดัชนี |
|---|---|---|
| สิ่งที่มันจัดเก็บ | เฉพาะคำสั่ง SELECT ใน metastore เท่านั้น | ตารางดัชนีแยกต่างหากที่เก็บตัวชี้ไปยังข้อมูล |
| จุดมุ่งหมาย | ลดความซับซ้อนหรือจำกัดสิ่งที่คำสั่งค้นหาส่งคืน | ลดปริมาณข้อมูลที่สแกนหาเงื่อนไข |
| ต้นทุนดิสก์ | ไม่มี | พื้นที่จัดเก็บข้อมูลเพิ่มเติม พร้อมระบบกู้คืนข้อมูลหลังจากมีการเปลี่ยนแปลงข้อมูล |
| การเข้าถึงการเขียน | อ่านอย่างเดียว | ไม่ได้สอบถามโดยตรง ตัวปรับแต่งประสิทธิภาพใช้ข้อมูลนี้ |
| สถานะปัจจุบัน | รองรับอย่างเต็มที่ | ถูกลบออกใน Hive เวอร์ชัน 3.0 |
ในทางปฏิบัติ การสร้างวิวมีไว้เพื่อให้อ่านง่ายและควบคุมการเข้าถึง ในขณะที่การสร้างดัชนีมีไว้เพื่อเพิ่มประสิทธิภาพเฉพาะในคอลัมน์ที่เลือกไว้เท่านั้น
ประเภทของดัชนีใน Hive พร้อมไวยากรณ์
Hive เวอร์ชัน 2.x ขึ้นไปมีตัวจัดการดัชนีสองตัว และตัวจัดการนั้นจะถูกระบุชื่อในข้อกำหนด AS ที่บังคับใช้ การสร้างดัชนีแบบกะทัดรัด (Compact indexing) ถูกนำมาใช้ใน Hive เวอร์ชัน 0.7.0 และการสร้างดัชนีแบบบิตแมป (Bitmap indexing) ใน Hive เวอร์ชัน 0.8.0
- ดัชนีแบบย่อ: วิธีการนี้จะจัดเก็บค่าพร้อมกับที่อยู่ของบล็อก HDFS ที่เก็บค่านั้นไว้ แทนที่จะบันทึกตำแหน่งของแต่ละค่าที่ปรากฏ เหมาะสำหรับคอลัมน์ที่มีค่าแตกต่างกันจำนวนมาก
- ดัชนีภาพบิตแมป: โดยจะจัดเก็บบิตแมปหนึ่งภาพต่อค่าที่ไม่ซ้ำกันหนึ่งค่า ซึ่งเป็นวิธีการปกติสำหรับคอลัมน์ที่มีค่าที่ไม่ซ้ำกันจำนวนน้อย เช่น สถานะหรือเพศ
มีการสร้าง แสดงรายการ และลบดัชนีขนาดกะทัดรัดดังต่อไปนี้:
CREATE INDEX table01_index ON TABLE table01 (column2) AS 'COMPACT'; SHOW INDEX ON table01; DROP INDEX table01_index ON table01;
ตัวเลือก WITH DEFERRED REBUILD จะลงทะเบียนดัชนีโดยไม่เติมข้อมูลลงไป เพื่อให้สามารถกำหนดเวลาการสร้างดัชนีแยกต่างหากได้ด้วยคำสั่ง ALTER INDEX การสร้างดัชนีบิตแมปก็ทำในลักษณะเดียวกัน เพียงแต่ใช้ชื่อตัวจัดการที่แตกต่างกัน:
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;
ดัชนีจะไม่ได้รับการอัปเดตโดยอัตโนมัติ ทุกครั้งที่ตารางหลักได้รับข้อมูลใหม่ จะต้องเรียกใช้คำสั่ง ALTER INDEX … REBUILD อีกครั้ง และสำหรับตารางที่แบ่งพาร์ติชัน การสร้างดัชนีใหม่สามารถจำกัดได้เฉพาะพาร์ติชันเดียว
เหตุใดจึงมีการลบฟังก์ชันการสร้างดัชนีออกใน Hive 3.0
ฟังก์ชันการสร้างดัชนีถูกลบออกจาก Hive ในเวอร์ชัน 3.0 ภายใต้ HIVE-18448 ดังนั้นคำสั่ง CREATE INDEX, SHOW INDEX และ DROP INDEX จึงไม่มีอยู่ในคลัสเตอร์ปัจจุบันอีกต่อไป ฟังก์ชันนี้ไม่ค่อยคุ้มค่ากับค่าใช้จ่ายในการสร้างใหม่เมื่อการจัดเก็บข้อมูลแบบคอลัมน์และตัวเพิ่มประสิทธิภาพตามต้นทุนมีความเสถียรมากขึ้นแล้ว มีฟังก์ชันทดแทนสามอย่างที่ทำหน้าที่เดียวกัน
- มุมมองแบบ Materialized: เปิดตัวใน Hive เวอร์ชัน 3.0.0 มุมมองที่เป็นรูปธรรม ระบบจะจัดเก็บผลลัพธ์ที่คำนวณไว้ล่วงหน้าของคำสั่งค้นหา และตัวปรับแต่งประสิทธิภาพจะเขียนคำสั่งค้นหาที่เข้ามาใหม่โดยอัตโนมัติโดยอ้างอิงจากผลลัพธ์ดังกล่าว
- รูปแบบไฟล์แบบคอลัมน์: ORC และ Parquet มีดัชนีขนาดเล็กและสถิติค่าต่ำสุด/สูงสุดในตัว ทำให้ผู้อ่านสามารถข้ามแถบข้อมูล บล็อก หรือไฟล์ทั้งหมดได้โดยไม่ต้องกำหนดดัชนีเอง
- พาร์ติชันและบัคเก็ต: การแบ่งพาร์ติชันและการจัดกลุ่ม ตัดแต่งข้อมูลในระดับไดเร็กทอรีและไฟล์ ซึ่งโดยปกติแล้วจะลบข้อมูลมากกว่าการสร้างดัชนีหลายเท่า
ใน Hive เวอร์ชัน 2.x ดัชนียังคงใช้งานได้ แต่สำหรับงานใหม่ๆ จะเหมาะสมกว่าหากใช้ตัวเลือกใดตัวเลือกหนึ่งข้างต้น
