Hive สร้างตาราง: คำสั่ง Internal, Alter และ Drop พร้อมตัวอย่าง

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

การสร้าง การแก้ไข และการลบping ตารางใน Apache Hive ใช้คำสั่ง DDL ในรูปแบบ SQL ที่คุ้นเคย แต่ผลลัพธ์จะขึ้นอยู่กับว่าตารางนั้นเป็นตารางภายใน ซึ่ง Hive เป็นเจ้าของ หรือเป็นตารางภายนอก ซึ่งเป็นเพียงการอธิบายไฟล์เท่านั้น

  • 🧱 สร้างตาราง: คำสั่งเดียวจะกำหนดคอลัมน์ รูปแบบแถว และอาจรวมถึงตำแหน่งจัดเก็บข้อมูลของตาราง Hive ด้วย
  • 🏷️ เปลี่ยนตาราง: คำสั่ง RENAME ใช้สำหรับเปลี่ยนชื่อตาราง และคำสั่ง ADD COLUMNS หรือ CHANGE COLUMN ใช้สำหรับแก้ไขโครงสร้างตารางโดยไม่ต้องโหลดข้อมูลใหม่
  • 🗑️ ลากโต๊ะ: หล่นping การลบตารางภายในจะลบทั้งโครงสร้างและข้อมูล ในขณะที่การลบแบบ dropping ตารางภายนอกจะลบเฉพาะข้อมูลเมตาเท่านั้น
  • 🔒 ภายในเป็นเจ้าของโดย: ตารางภายในหรือตารางที่ได้รับการจัดการจะอยู่ภายใต้ไดเร็กทอรีคลังข้อมูล และ Hive จะควบคุมวงจรชีวิตทั้งหมดของตารางนั้น
  • 🔗 มีการอ้างอิงถึงภายนอก: ตารางภายนอกชี้ไปยังไฟล์ที่เครื่องมืออื่นๆ ก็อ่านด้วยเช่นกัน ดังนั้นไฟล์เหล่านั้นจึงยังคงอยู่แม้ว่าจะถูกลบออกไปแล้วก็ตาม
  • 🔎 ตรวจสอบประเภท: คำสั่ง DESCRIBE FORMATTED จะรายงานข้อมูลว่าเป็น MANAGED_TABLE หรือ EXTERNAL_TABLE ซึ่งช่วยขจัดความไม่แน่นอนก่อนทำการลบข้อมูล

คำสั่งสร้าง แก้ไข และลบตารางใน Hive พร้อมตัวอย่าง

การดำเนินการกับตาราง เช่น การสร้าง การแก้ไข และการลบping ในบทแนะนำนี้ เราจะมาดูโครงสร้างตารางใน Hive กัน แต่ละขั้นตอนจะแสดงให้เห็นในรูปแบบการใช้งานจริงก่อน แล้วจึงแสดงในรูปแบบคำสั่งที่สามารถนำกลับมาใช้ใหม่ได้

วิธีการสร้าง แก้ไข และลบตารางใน Hive

ในภาพหน้าจอด้านล่าง เรากำลังสร้างตารางที่มีคอลัมน์และเปลี่ยนชื่อตาราง

  1. สร้างตาราง guru_sample โดยกำหนดชื่อคอลัมน์สองคอลัมน์เป็น “empid” และ “empname”
  2. แสดงตารางที่มีอยู่ในฐานข้อมูล guru99
  3. guru_sample แสดงผลภายใต้ตาราง
  4. เปลี่ยนตาราง “guru_sample” เป็น “guru_sampleNew”
  5. อีกครั้ง เมื่อคุณเรียกใช้คำสั่ง “show” มันจะแสดงชื่อใหม่คือ guru_sampleNew

เซสชันด้านล่างนี้จะดำเนินการทั้งห้าขั้นตอนตามลำดับ รังผึ้ง> คำสั่ง prompt และการเรียกใช้คำสั่ง SHOW TABLES สองครั้งก่อนและหลังการเปลี่ยนชื่อจะทำให้เห็นผลลัพธ์ได้อย่างชัดเจน

กำลังสร้างเซสชัน Hive ชื่อ guru_sample และเปลี่ยนชื่อเป็น guru_sampleNew

หล่นping ตาราง guru_sampleNew:

คำสั่ง DROP TABLE เพียงคำสั่งเดียวจะลบตารางที่เปลี่ยนชื่อออกไป และ Hive จะตอบกลับด้วย OK

เปลือกรังผึ้งร่วงหล่นping ตาราง guru_sampleNew พร้อมการตอบสนอง OK

ไวยากรณ์และข้อกำหนดทั่วไปของคำสั่ง CREATE TABLE ใน Hive

ตัวอย่างข้างต้นใช้รูปแบบที่สั้นที่สุดเท่าที่จะเป็นไปได้ คำสั่งที่อธิบายไว้นั้นยอมรับข้อความเพิ่มเติมได้หลายข้อ และแต่ละข้อจะตัดสินใจบางอย่าง ซึ่งตัวอย่างจะคงค่าเริ่มต้นไว้

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
  [(col_name data_type [COMMENT col_comment], ...)]
  [COMMENT table_comment]
  [PARTITIONED BY (col_name data_type, ...)]
  [CLUSTERED BY (col_name, ...) INTO num_buckets BUCKETS]
  [ROW FORMAT row_format]
  [STORED AS file_format]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (property_name=property_value, ...)];
ประโยค สิ่งที่มันควบคุม
ภายนอก คำสั่ง DROP สร้างตารางภายนอก ดังนั้นไฟล์ข้อมูลจึงยังคงอยู่ที่เดิม
ชั่วคราว สร้างตารางที่มีขอบเขตการใช้งานเฉพาะเซสชัน ซึ่งจะหายไปเมื่อเซสชันสิ้นสุดลง
หากไม่มีอยู่ ระงับข้อผิดพลาดเมื่อมีตารางชื่อนั้นอยู่แล้ว
แบ่งตาม แบ่งตารางออกเป็นไดเร็กทอรีหนึ่งแห่งต่อค่าคีย์แต่ละค่า
จัดกลุ่มตาม … เป็น n ถัง เข้ารหัสแถวลงในไฟล์จำนวนคงที่
รูปแบบแถว / จัดเก็บเป็น ตั้งค่าตัวคั่นหรือ SerDe และรูปแบบไฟล์ เช่น TEXTFILE, ORC หรือ Parquet
LOCATION กำหนดให้ตารางชี้ไปยังพาธ HDFS เฉพาะ แทนที่จะใช้พาธคลังข้อมูลเริ่มต้น
คุณสมบัติของทีบีแอล แนบคู่คีย์-ค่าเมตาเดต้า รวมถึง external.table.purge ด้วย

รูปแบบที่เกี่ยวข้อง สร้างตารางใหม่ชื่อ new_table โดยมีลักษณะเหมือนกับตารางที่มีอยู่แล้ว (existing_table)คัดลอกโครงสร้างข้อมูลโดยไม่คัดลอกแถวใดๆ ข้อกำหนดเชิงโครงสร้าง เช่น PARTITIONED BY และ CLUSTERED BY จะอธิบายรายละเอียดเพิ่มเติมในคู่มือนี้ พาร์ติชั่นและบัคเก็ตของ Hive.

ประเภทของตารางและการใช้งาน

สำหรับการสร้างตารางนั้น ก็เหมือนกับการสร้างตารางในฐานข้อมูลเชิงสัมพันธ์แบบดั้งเดิม เราสามารถใช้งานฟังก์ชันต่างๆ เช่น การกรองและการเชื่อมต่อตารางได้

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

ตารางภายในใน Hive

  • ตารางภายใน (Internal Table) มีลักษณะที่เชื่อมโยงกันอย่างแน่นหนา ในตารางประเภทนี้ เราต้องสร้างตารางก่อนแล้วจึงโหลดข้อมูลเข้าไป
  • เราสามารถเรียกข้อมูลนี้ว่า ข้อมูลบนโครงสร้างข้อมูล (schema) ได้
  • โดยการหยดping ตารางนี้ ทั้งข้อมูลและโครงสร้างข้อมูลจะถูกลบออก
  • ตำแหน่งที่เก็บไว้ของตารางนี้จะอยู่ที่ /user/hive/warehouse
  • ตารางภายในเรียกอีกอย่างว่าตารางที่มีการจัดการ และมีเพียงตารางภายในเท่านั้นที่รองรับธุรกรรม TRUNCATE, ARCHIVE, MERGE, CONCATENATE และ ACID

เมื่อใดจึงควรเลือกตารางภายใน?

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

ตัวอย่างโค้ดสำหรับตารางภายใน

  1. เพื่อสร้างตารางภายใน
     Hive>CREATE TABLE guruhive_internaltable (id INT,Name STRING);
    	 Row format delimited 
    	 Fields terminated by '\t';
  2. โหลดข้อมูลลงในตารางภายใน
        Hive>LOAD DATA INPATH '/user/guru99hive/data.txt' INTO table guruhive_internaltable;
  3. แสดงเนื้อหาของตาราง
        Hive>select * from guruhive_internaltable;
  4. เพื่อวางตารางภายใน
        Hive>DROP TABLE guruhive_internaltable;

หากคุณลบ guruhive_internaltable รวมถึงเมตาเดต้าและข้อมูลของมันจะถูกลบออกจาก Hive เว้นแต่จะระบุ PURGE ไว้ ไฟล์จะถูกย้ายไปยังโฟลเดอร์ถังขยะของ HDFS แทนที่จะถูกลบออกทันที

จากภาพหน้าจอต่อไปนี้ เราจะเห็นผลลัพธ์ของคำสั่งทั้งสี่คำสั่งในเซสชันเดียว ซึ่งจบลงด้วยการวางวัตถุลงอย่างสำเร็จ

การสร้าง การโหลด การสืบค้น และการลบเซสชัน Hiveping guruhive_internaltable

จากโค้ดข้างต้นและภาพหน้าจอที่แสดง เราได้ดำเนินการดังต่อไปนี้

  • สร้างตารางภายใน
  • โหลดข้อมูลลงในตารางภายใน
  • แสดงเนื้อหาของตาราง
  • เพื่อวางตารางภายใน

ตารางภายนอกใน Hive

  • ตารางภายนอก (External Table) มีลักษณะการเชื่อมต่อแบบหลวมๆ ข้อมูลจะอยู่ใน HDFS และตารางนี้จะถูกสร้างขึ้นบนข้อมูลใน HDFS
  • กล่าวอีกนัยหนึ่ง เราอาจกล่าวได้ว่ามันคือการสร้างโครงสร้างข้อมูล (schema) บนข้อมูลนั่นเอง
  • ในขณะที่ตกลงมาping ตารางดังกล่าวจะถูกลบเฉพาะโครงสร้าง (schema) เท่านั้น ข้อมูลจะยังคงอยู่ใน HDFS เหมือนเดิม
  • ตารางภายนอกมีตัวเลือกในการสร้างหลายสคีมาสำหรับข้อมูลที่จัดเก็บไว้ใน HDFS แทนที่จะลบข้อมูลทุกครั้งทุกครั้งที่มีการอัปเดตสคีมา
  • ตั้งแต่ Hive เวอร์ชัน 4.0.0 เป็นต้นไป การตั้งค่าคุณสมบัติตาราง external.table.purge เป็น true จะทำให้คำสั่ง DROP ลบข้อมูลทั้งหมดด้วยเช่นกัน

เมื่อใดจึงควรเลือกโต๊ะภายนอก

  • หากข้อมูลสำหรับการประมวลผลมีอยู่ใน HDFS
  • มีประโยชน์เมื่อมีการใช้ไฟล์ภายนอก Hive

ตัวอย่างโค้ดสำหรับตารางภายนอก

  1. สร้างตารางภายนอก
    Hive>CREATE EXTERNAL TABLE guruhive_external(id INT,Name STRING)
    	 Row format delimited
    	 Fields terminated by '\t'
    	 LOCATION '/user/guru99hive/guruhive_external';
  2. หากเราไม่ได้ระบุตำแหน่งที่ตั้งในขณะสร้างตาราง เราสามารถโหลดข้อมูลด้วยตนเองได้
        Hive>LOAD DATA INPATH '/user/guru99hive/data.txt' INTO TABLE guruhive_external;
  3. แสดงเนื้อหาของตาราง
      Hive>select * from guruhive_external;
  4. เพื่อลบตารางภายนอก
      Hive>DROP TABLE guruhive_external;

จากภาพหน้าจอต่อไปนี้ เราสามารถสังเกตผลลัพธ์ได้ โปรดสังเกตว่าการลบในตอนท้ายจะลบเฉพาะโครงสร้างข้อมูลเท่านั้น ไฟล์ที่อยู่ในพาธ LOCATION ยังคงไม่เปลี่ยนแปลง

การสร้าง การโหลด การสืบค้น และการลบเซสชัน Hiveping กูรูไฮฟ์_เอ็กซ์เทอร์นัล

ในโค้ดข้างต้น เราดำเนินการดังต่อไปนี้

  • สร้างตารางภายนอก
  • โหลดข้อมูลลงในตารางภายนอก
  • แสดงเนื้อหาของตาราง
  • หล่นping ตารางภายนอก

ความแตกต่างระหว่างตารางภายในและตารางภายนอก

คุณสมบัติ (Feature) ภายใน ภายนอก
schema ข้อมูลบนสคีมา สคีมาเกี่ยวกับข้อมูล
ที่เก็บสินค้า /ผู้ใช้/รัง/คลังสินค้า ตำแหน่ง HDFS ที่กำหนดโดย LOCATION
ความพร้อมใช้งานของข้อมูล ภายในระบบไฟล์ในเครื่อง ภายใน HDFS
ผลกระทบของ DROP ลบสคีมาและข้อมูล ลบเฉพาะสคีมา เว้นแต่ว่า external.table.purge จะเป็นจริง
การสนับสนุนการตัดทอน ที่สนับสนุน ไม่ได้รับการสนับสนุน
ธุรกรรมกรด ที่สนับสนุน ไม่ได้รับการสนับสนุน

การขอ เอกสารประกอบการใช้งาน Apache Hive กฎระบุไว้อย่างชัดเจนว่า: Hive ถือว่าตนเองเป็นเจ้าของข้อมูลสำหรับตารางที่จัดการโดย Hive และถือว่าตนเองไม่ได้เป็นเจ้าของข้อมูลสำหรับตารางภายนอก และความแตกต่างทั้งหมดที่กล่าวมาข้างต้นล้วนเกิดจากสมมติฐานเดียวนี้

เอกสารอ้างอิงคำสั่ง ALTER TABLE และ DROP TABLE

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

คำแถลง จุดมุ่งหมาย
ALTER TABLE table_name RENAME TO new_name; เปลี่ยนชื่อตาราง สำหรับตารางแบบจัดการ (Managed Table) การดำเนินการนี้จะย้ายไดเร็กทอรี HDFS ของตารางนั้นด้วย
ALTER TABLE table_name ADD COLUMNS (col_name data_type); เพิ่มคอลัมน์หนึ่งคอลัมน์หรือมากกว่านั้นต่อท้ายโครงสร้างข้อมูล
ALTER TABLE table_name CHANGE COLUMN old_name new_name data_type; เปลี่ยนชื่อคอลัมน์หรือเปลี่ยนประเภทของคอลัมน์
ALTER TABLE table_name REPLACE COLUMNS (…); แทนที่รายการคอลัมน์ทั้งหมดด้วยรายการใหม่
ALTER TABLE table_name SET TBLPROPERTIES ('EXTERNAL'='TRUE'); แปลงตารางที่จัดการแล้วให้เป็นตารางภายนอก และค่า FALSE จะกลับกัน
ลบตาราง [ถ้ามีอยู่] ชื่อตาราง [ล้างข้อมูล]; ลบตาราง; คำสั่ง PURGE จะข้ามโฟลเดอร์ถังขยะ ดังนั้นข้อมูลจะไม่สามารถกู้คืนได้
ลบข้อมูลในตาราง [TABLE] ชื่อตาราง; ลบแถวทั้งหมด แต่คงโครงสร้างตารางไว้ เฉพาะตารางที่จัดการโดยระบบเท่านั้น

มีมาตรการป้องกันสองอย่างที่ควรใส่ไว้ในสคริปต์ใดๆ ก็ตาม คำสั่ง IF EXISTS จะป้องกันไม่ให้การลบตารางล้มเหลวหากตารางนั้นถูกลบไปแล้ว และคำสั่ง DESCRIBE FORMATTED จะตรวจสอบว่าเป้าหมายเป็น MANAGED_TABLE หรือ EXTERNAL_TABLE ก่อนที่จะทำการลบ

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

เรียกใช้คำสั่ง DESCRIBE FORMATTED table_name แถวประเภทตารางจะแสดงค่าเป็น MANAGED_TABLE หรือ EXTERNAL_TABLE การตรวจสอบก่อนลบข้อมูลเป็นวิธีที่ประหยัดที่สุดในการหลีกเลี่ยงการลบข้อมูลที่งานอื่นๆ ยังคงอ่านอยู่

ใช่แล้ว คำสั่ง ALTER TABLE table_name SET TBLPROPERTIES ('EXTERNAL'='TRUE') จะเปลี่ยนประเภทข้อมูลใน metastore และค่า FALSE จะเปลี่ยนกลับเป็นค่าเดิม ไฟล์ข้อมูลยังคงอยู่ที่เดิม ดังนั้นจึงไม่จำเป็นต้องโหลดข้อมูลใหม่

โดยปกติแล้วจะไม่ลบข้อมูล เฉพาะรายการใน metastore เท่านั้นที่จะถูกลบ อย่างไรก็ตาม ตั้งแต่ Hive เวอร์ชัน 4.0.0 เป็นต้นไป ตารางภายนอกที่มีคุณสมบัติ external.table.purge ตั้งค่าเป็น true ก็จะถูกลบข้อมูลด้วยคำสั่ง DROP เช่นกัน ดังนั้นควรตรวจสอบคุณสมบัติก่อน

คำสั่ง CREATE TABLE แบบธรรมดาในปัจจุบันจะสร้างตาราง ORC ที่จัดการได้และรองรับธุรกรรมโดยค่าเริ่มต้น แทนที่จะเป็นตารางข้อความธรรมดา การเพิ่มคีย์เวิร์ด EXTERNAL จะช่วยรักษาพฤติกรรมแบบเก่าที่ไม่เป็นไปตามหลัก ACID บนคลัสเตอร์ Hive 3

คำสั่ง TRUNCATE จะลบทุกแถวแต่คงโครงสร้างตารางไว้ และใช้ได้เฉพาะกับตารางแบบ Managed Table เท่านั้น ส่วนคำสั่ง DROP จะลบโครงสร้างตารางด้วย TRUNCATE จึงเป็นตัวเลือกที่ปลอดภัยกว่าเมื่อต้องการให้โครงสร้างของตารางยังคงอยู่หลังจากโหลดข้อมูลใหม่

ไม่ Hive จะแปลงตัวระบุเป็นตัวพิมพ์เล็กใน metastore ดังนั้น GURU_SAMPLE และ guru_sample จึงหมายถึงตารางเดียวกัน ค่าสตริงภายในข้อมูลยังคงคำนึงถึงตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก ซึ่งเป็นเหตุผลว่าทำไมการเปรียบเทียบด้วย WHERE จึงอาจพลาดแถวบางแถวได้

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

Copilot สามารถสร้างคำสั่ง CREATE, ALTER และ DROP ได้จากข้อความแสดงความคิดเห็นสั้นๆ และผู้ช่วยอัตโนมัติสามารถสร้างสคริปต์การย้ายข้อมูลทั้งหมดได้ Revโปรดตรวจสอบคำหลัก EXTERNAL และตัวเลือก PURGE เนื่องจากหากเดาผิดอาจทำให้ข้อมูลจริงถูกลบได้

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