Hive View และการทำดัชนี: สร้างด้วยตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

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

  • 🇧🇷 มุมมองนี้สมเหตุสมผล: วิวจะจัดเก็บเฉพาะคำสั่ง SELECT ของมันไว้ในเมตาสโตร์ ดังนั้นจึงไม่ใช้พื้นที่ดิสก์ของตัวเอง
  • 🔒 ออกแบบมาให้สามารถอ่านได้อย่างเดียว: วิวไม่สามารถเป็นเป้าหมายของคำสั่ง LOAD, INSERT หรือ ALTER ได้ เนื่องจาก Hive จะประเมินวิวใหม่ทุกครั้งที่มีการเรียกใช้คำสั่ง SQL
  • 📍 ดัชนีชี้ไปยังข้อมูล: ดัชนีคือตัวชี้ไปยังค่าในคอลัมน์ ซึ่งช่วยให้ Hive สามารถอ่านส่วนหนึ่งของไฟล์แทนที่จะอ่านทั้งตาราง
  • 🗂️ ผู้ดูแลสองคน: การจัดทำดัชนีแบบกะทัดรัดเหมาะสำหรับคอลัมน์ที่มีค่าแตกต่างกันมาก และการจัดทำดัชนีแบบบิตแมปเหมาะสำหรับคอลัมน์ที่มีค่าแตกต่างกันน้อย
  • 🔄 การประกอบใหม่ด้วยตนเอง: ดัชนีจะไม่ได้รับการอัปเดตโดยอัตโนมัติ ดังนั้นจึงต้องเรียกใช้คำสั่ง ALTER INDEX REBUILD หลังจากมีการเปลี่ยนแปลงตารางฐานข้อมูล
  • ???? ถูกลบออกใน Hive เวอร์ชัน 3.0: ภายใต้ HIVE-18448 ได้มีการยกเลิกการทำดัชนี และแทนที่ด้วยมุมมองแบบ Materialized Views, การจัดเก็บข้อมูลแบบ ORC หรือ Parquet และการแบ่งพาร์ติชัน

อธิบายมุมมองและดัชนีใน Hive พร้อมตัวอย่าง

มุมมองคืออะไร?

วิวมีลักษณะคล้ายกับตาราง และถูกสร้างขึ้นตามความต้องการ วิวเป็นวัตถุเชิงตรรกะล้วนๆ โดยไม่มีการจัดเก็บข้อมูลของตัวเอง: 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 ดัชนียังคงใช้งานได้ แต่สำหรับงานใหม่ๆ จะเหมาะสมกว่าหากใช้ตัวเลือกใดตัวเลือกหนึ่งข้างต้น

คำถามที่พบบ่อย

คำสั่ง DROP VIEW view_name จะลบวิว และคำสั่ง ALTER VIEW view_name RENAME TO new_name จะเปลี่ยนชื่อวิว เนื่องจากวิวไม่มีข้อมูล จึงใช้คำสั่ง drop ได้ping ไม่มีใครแตะต้องตารางฐานข้อมูลเลย มีเพียงรายการในเมตาสโตร์เท่านั้นที่หายไป

Materialized View จะจัดเก็บผลลัพธ์ของคำสั่งค้นหาที่คำนวณไว้ล่วงหน้าเป็นข้อมูลจริง ดังนั้นจึงใช้พื้นที่ดิสก์และต้องทำการสร้างใหม่ (REBUILD) ในขณะที่ View ปกติจะจัดเก็บเฉพาะข้อความของคำสั่งค้นหาและจะถูกคำนวณใหม่ทุกครั้งที่มีการอ้างอิง

ไม่ เมตาสโตร์จะเก็บเฉพาะคำสั่ง SELECT และรายการคอลัมน์ที่ได้รับการแก้ไขแล้วเท่านั้น ไม่มีอะไรมากไปกว่านั้น การอ้างอิงแต่ละครั้งจะเรียกใช้คิวรีพื้นฐานซ้ำ ซึ่งเป็นเหตุผลว่าทำไมวิวที่สร้างจาก join ที่ช้าจึงยังคงช้าอยู่

ใน Hive เวอร์ชัน 0.12.0 และก่อนหน้านั้น ชื่อดัชนีจะคำนึงถึงตัวพิมพ์ใหญ่เล็กสำหรับคำสั่ง CREATE INDEX และ DROP INDEX ในขณะที่ ALTER INDEX ต้องใช้ตัวพิมพ์เล็กเท่านั้น ส่วน Hive เวอร์ชัน 0.13.0 ได้เปลี่ยนมาใช้ระบบไม่คำนึงถึงตัวพิมพ์ใหญ่เล็กสำหรับชื่อดัชนีในทุกคำสั่งแล้ว

ใช่แล้ว สำหรับคลัสเตอร์สมัยใหม่ทุกเครื่อง การตัดพาร์ติชันจะลบไดเร็กทอรีทั้งหมดออกก่อนที่การสแกนจะเริ่มต้น และการจัดกลุ่มจะจำกัดการเชื่อมต่อหรือการสุ่มตัวอย่างให้เหลือเฉพาะไฟล์ที่ต้องการ ซึ่งโดยทั่วไปแล้วจะดีกว่าสิ่งที่ตารางดัชนีสามารถทำได้

เครื่องมือแมชชีนเลิร์นนิงจะวิเคราะห์บันทึกการสืบค้น จัดอันดับคอลัมน์เงื่อนไขตามความสามารถในการเลือกและความถี่ และแนะนำว่าควรใช้ materialized view หรือ partition scheme ในส่วนใด ตรวจสอบความถูกต้องของแต่ละคำแนะนำกับแผน EXPLAIN ก่อนนำไปใช้

โปรแกรมนี้สร้างคำสั่ง CREATE VIEW ได้อย่างน่าเชื่อถือจากข้อความแสดงความคิดเห็นสั้นๆ ตรวจสอบรายละเอียดเฉพาะเวอร์ชันด้วย เพราะมันยังคงสร้างไวยากรณ์ CREATE INDEX ซึ่งคลัสเตอร์ Hive 3.0 หรือเวอร์ชันที่ใหม่กว่าจะปฏิเสธโดยสิ้นเชิง

ดัชนีเป็นตารางตัวชี้แยกต่างหาก และ Hive จะไม่รีเฟรชดัชนีเมื่อตารางหลักเปลี่ยนแปลง หากไม่มีการสร้างใหม่ ตัวชี้ก็จะล้าสมัย ดังนั้นตัวปรับแต่งประสิทธิภาพจึงข้ามดัชนีไป หรือส่งคืนผลลัพธ์ที่ล้าสมัย

สรุปโพสต์นี้ด้วย: