Hive สร้างตาราง: คำสั่ง Internal, Alter และ Drop พร้อมตัวอย่าง
⚡ สรุปอย่างชาญฉลาด
การสร้าง การแก้ไข และการลบping ตารางใน Apache Hive ใช้คำสั่ง DDL ในรูปแบบ SQL ที่คุ้นเคย แต่ผลลัพธ์จะขึ้นอยู่กับว่าตารางนั้นเป็นตารางภายใน ซึ่ง Hive เป็นเจ้าของ หรือเป็นตารางภายนอก ซึ่งเป็นเพียงการอธิบายไฟล์เท่านั้น
การดำเนินการกับตาราง เช่น การสร้าง การแก้ไข และการลบping ในบทแนะนำนี้ เราจะมาดูโครงสร้างตารางใน Hive กัน แต่ละขั้นตอนจะแสดงให้เห็นในรูปแบบการใช้งานจริงก่อน แล้วจึงแสดงในรูปแบบคำสั่งที่สามารถนำกลับมาใช้ใหม่ได้
วิธีการสร้าง แก้ไข และลบตารางใน Hive
ในภาพหน้าจอด้านล่าง เรากำลังสร้างตารางที่มีคอลัมน์และเปลี่ยนชื่อตาราง
- สร้างตาราง guru_sample โดยกำหนดชื่อคอลัมน์สองคอลัมน์เป็น “empid” และ “empname”
- แสดงตารางที่มีอยู่ในฐานข้อมูล guru99
- guru_sample แสดงผลภายใต้ตาราง
- เปลี่ยนตาราง “guru_sample” เป็น “guru_sampleNew”
- อีกครั้ง เมื่อคุณเรียกใช้คำสั่ง “show” มันจะแสดงชื่อใหม่คือ guru_sampleNew
เซสชันด้านล่างนี้จะดำเนินการทั้งห้าขั้นตอนตามลำดับ รังผึ้ง> คำสั่ง prompt และการเรียกใช้คำสั่ง SHOW TABLES สองครั้งก่อนและหลังการเปลี่ยนชื่อจะทำให้เห็นผลลัพธ์ได้อย่างชัดเจน
หล่นping ตาราง guru_sampleNew:
คำสั่ง DROP TABLE เพียงคำสั่งเดียวจะลบตารางที่เปลี่ยนชื่อออกไป และ Hive จะตอบกลับด้วย 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 จัดการวงจรชีวิตของข้อมูลทั้งหมดรวมถึงการลบข้อมูลด้วย
ตัวอย่างโค้ดสำหรับตารางภายใน
- เพื่อสร้างตารางภายใน
Hive>CREATE TABLE guruhive_internaltable (id INT,Name STRING); Row format delimited Fields terminated by '\t';
- โหลดข้อมูลลงในตารางภายใน
Hive>LOAD DATA INPATH '/user/guru99hive/data.txt' INTO table guruhive_internaltable;
- แสดงเนื้อหาของตาราง
Hive>select * from guruhive_internaltable;
- เพื่อวางตารางภายใน
Hive>DROP TABLE guruhive_internaltable;
หากคุณลบ guruhive_internaltable รวมถึงเมตาเดต้าและข้อมูลของมันจะถูกลบออกจาก Hive เว้นแต่จะระบุ PURGE ไว้ ไฟล์จะถูกย้ายไปยังโฟลเดอร์ถังขยะของ HDFS แทนที่จะถูกลบออกทันที
จากภาพหน้าจอต่อไปนี้ เราจะเห็นผลลัพธ์ของคำสั่งทั้งสี่คำสั่งในเซสชันเดียว ซึ่งจบลงด้วยการวางวัตถุลงอย่างสำเร็จ
จากโค้ดข้างต้นและภาพหน้าจอที่แสดง เราได้ดำเนินการดังต่อไปนี้
- สร้างตารางภายใน
- โหลดข้อมูลลงในตารางภายใน
- แสดงเนื้อหาของตาราง
- เพื่อวางตารางภายใน
ตารางภายนอกใน Hive
- ตารางภายนอก (External Table) มีลักษณะการเชื่อมต่อแบบหลวมๆ ข้อมูลจะอยู่ใน HDFS และตารางนี้จะถูกสร้างขึ้นบนข้อมูลใน HDFS
- กล่าวอีกนัยหนึ่ง เราอาจกล่าวได้ว่ามันคือการสร้างโครงสร้างข้อมูล (schema) บนข้อมูลนั่นเอง
- ในขณะที่ตกลงมาping ตารางดังกล่าวจะถูกลบเฉพาะโครงสร้าง (schema) เท่านั้น ข้อมูลจะยังคงอยู่ใน HDFS เหมือนเดิม
- ตารางภายนอกมีตัวเลือกในการสร้างหลายสคีมาสำหรับข้อมูลที่จัดเก็บไว้ใน HDFS แทนที่จะลบข้อมูลทุกครั้งทุกครั้งที่มีการอัปเดตสคีมา
- ตั้งแต่ Hive เวอร์ชัน 4.0.0 เป็นต้นไป การตั้งค่าคุณสมบัติตาราง external.table.purge เป็น true จะทำให้คำสั่ง DROP ลบข้อมูลทั้งหมดด้วยเช่นกัน
เมื่อใดจึงควรเลือกโต๊ะภายนอก
- หากข้อมูลสำหรับการประมวลผลมีอยู่ใน HDFS
- มีประโยชน์เมื่อมีการใช้ไฟล์ภายนอก Hive
ตัวอย่างโค้ดสำหรับตารางภายนอก
- สร้างตารางภายนอก
Hive>CREATE EXTERNAL TABLE guruhive_external(id INT,Name STRING) Row format delimited Fields terminated by '\t' LOCATION '/user/guru99hive/guruhive_external';
- หากเราไม่ได้ระบุตำแหน่งที่ตั้งในขณะสร้างตาราง เราสามารถโหลดข้อมูลด้วยตนเองได้
Hive>LOAD DATA INPATH '/user/guru99hive/data.txt' INTO TABLE guruhive_external;
- แสดงเนื้อหาของตาราง
Hive>select * from guruhive_external;
- เพื่อลบตารางภายนอก
Hive>DROP TABLE guruhive_external;
จากภาพหน้าจอต่อไปนี้ เราสามารถสังเกตผลลัพธ์ได้ โปรดสังเกตว่าการลบในตอนท้ายจะลบเฉพาะโครงสร้างข้อมูลเท่านั้น ไฟล์ที่อยู่ในพาธ LOCATION ยังคงไม่เปลี่ยนแปลง
ในโค้ดข้างต้น เราดำเนินการดังต่อไปนี้
- สร้างตารางภายนอก
- โหลดข้อมูลลงในตารางภายนอก
- แสดงเนื้อหาของตาราง
- หล่น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 ก่อนที่จะทำการลบ





