ประเภทข้อมูลไฮฟ์: วิธีสร้างและวางฐานข้อมูลในไฮฟ์
⚡ สรุปอย่างชาญฉลาด
ประเภทข้อมูลของ Hive กำหนดว่าแต่ละคอลัมน์ของตารางสามารถเก็บอะไรได้บ้าง และคำสั่ง CREATE DATABASE และ DROP DATABASE จะตั้งค่าหรือลบเนมสเปซที่ตารางเหล่านั้นอยู่ภายในเมตาสโตร์ของ Hive

ชนิดข้อมูลเป็นองค์ประกอบที่สำคัญมากในภาษาการสืบค้นข้อมูลและการสร้างแบบจำลองข้อมูลของ Hive ในการกำหนดชนิดคอลัมน์ของตาราง เราจำเป็นต้องรู้จักชนิดข้อมูลและการใช้งานของมัน
ต่อไปนี้เป็นภาพรวมโดยย่อของประเภทข้อมูลบางประเภทที่มีอยู่ใน Hive:
- ประเภทตัวเลข
- ประเภทสตริง
- ประเภทวันที่/เวลา
- ประเภทที่ซับซ้อน
ชนิดข้อมูลในไฮฟ์
คอลัมน์ทุกคอลัมน์ใน Hive จะถูกประกาศด้วยประเภทข้อมูลอย่างใดอย่างหนึ่งดังต่อไปนี้ โดยประเภทข้อมูลพื้นฐานจะอยู่ลำดับแรก ตามด้วยประเภทข้อมูลที่ซับซ้อนกว่าซึ่งสามารถเก็บค่าได้มากกว่าหนึ่งค่าในคอลัมน์เดียว
ประเภทข้อมูลตัวเลขไฮฟ์
คอลัมน์ตัวเลขมีขนาดตั้งแต่หนึ่งไบต์ถึงแปดไบต์ ดังนั้นการเลือกชนิดข้อมูลที่เล็กที่สุดที่เหมาะสมกับค่าจะช่วยลดทั้งพื้นที่จัดเก็บและต้นทุนการสแกน
| ประเภท | การจัดสรรหน่วยความจำ |
|---|---|
| ไทนี่อินท์ | จำนวนเต็มแบบลงนามขนาด 1 ไบต์ (-128 ถึง 127) |
| สมอลลินท์ | จำนวนเต็มแบบลงนามขนาด 2 ไบต์ (-32,768 ถึง 32,767) |
| INT | จำนวนเต็มแบบลงนามขนาด 4 ไบต์ (-2,147,483,648 ถึง 2,147,483,647) |
| บิ๊กอินท์ | จำนวนเต็มแบบลงนามขนาด 8 ไบต์ (-9,223,372,036,854,775,808 ถึง 9,223,372,036,854,775,807) |
| ลอย | เลขทศนิยมความแม่นยำเดี่ยว 4 ไบต์ |
| ซ้อน | เลขทศนิยมแบบความแม่นยำสองเท่าขนาด 8 ไบต์ |
| ทศนิยม | เราสามารถกำหนดความแม่นยำและมาตราส่วนในประเภทนี้ได้โดยใช้ DECIMAL(precision, scale) หากไม่ได้ระบุค่าเหล่านี้ Hive จะใช้ DECIMAL(10,0) แทน |
ประเภทข้อมูลสตริงไฮฟ์
คอลัมน์อักขระมีสามรูปแบบ และความแตกต่างอยู่ที่ว่า Hive บังคับใช้ความยาวที่กำหนดไว้หรือไม่
| ประเภท | ความยาว |
|---|---|
| ชาร์ | ความยาวคงที่ สูงสุด 255 ตัวอักษร ค่าที่สั้นกว่าจะถูกเติมด้วยช่องว่าง |
| วาร์ชาร์ | ความยาวตั้งแต่ 1 ถึง 65,535 ตัวอักษร ค่าที่ยาวกว่านั้นจะถูกตัดทอนโดยอัตโนมัติ |
| STRING | เราสามารถกำหนดความยาวได้ที่นี่ (ไม่มีข้อจำกัด) |
ประเภทข้อมูลวันที่/เวลาไฮฟ์
คอลัมน์ข้อมูลตามเวลาจะถูกจัดเก็บโดยไม่มีการชดเชยเขตเวลา ซึ่งเป็นสิ่งสำคัญที่ควรจำไว้ก่อนเปรียบเทียบค่าที่เขียนโดยคลัสเตอร์ต่างๆ
| ประเภท | การใช้ |
|---|---|
| timestamp | รองรับแบบดั้งเดิม ยูนิกซ์ การประทับเวลาด้วยความแม่นยำระดับนาโนวินาทีที่เป็นตัวเลือก |
| วันที่ | ข้อมูลอยู่ในรูปแบบ YYYY-MM-DD ช่วงค่าที่รองรับสำหรับประเภทข้อมูล Date คือ 0000-01-01 ถึง 9999-12-31 ขึ้นอยู่กับการรองรับของฟังก์ชันพื้นฐาน Java วันธรรมดา |
ประเภทข้อมูลเบ็ดเตล็ดของ Hive
มีหน่วยข้อมูลพื้นฐานอีกสองหน่วยที่อยู่นอกเหนือกลุ่มตัวเลข สตริง และวันที่ แต่ปรากฏให้เห็นเป็นประจำในรูปแบบข้อมูลจริง
| ประเภท | การใช้ |
|---|---|
| บูลีน | เก็บค่าจริงหรือเท็จ |
| ไบนารี่ | จัดเก็บอาร์เรย์ของไบต์ ซึ่งช่วยป้องกันไม่ให้ข้อมูลดิบปรากฏในคอลัมน์ประเภท STRING |
ประเภทข้อมูลที่ซับซ้อนของ Hive
ประเภทข้อมูลที่ซับซ้อนจะซ้อนค่าต่างๆ ไว้ภายในคอลัมน์เดียว ซึ่งช่วยลดการเชื่อมต่อเพิ่มเติมที่การออกแบบเชิงสัมพันธ์จำเป็นต้องใช้
| ประเภท | การใช้ |
|---|---|
| อาร์เรย์ | อาเรย์ ไม่อนุญาตให้ใช้ค่าลบและนิพจน์ที่ไม่คงที่ |
| แผนที่ | แผนที่ ไม่อนุญาตให้ใช้ค่าลบและนิพจน์ที่ไม่คงที่ |
| โครงสร้าง | โครงสร้าง |
| สหภาพ | ยูเนียนไทป์ |
ตัวอย่างประเภทข้อมูลที่ซับซ้อนของ Hive
ตารางด้านบนแสดงรูปแบบการประกาศ คำสั่งด้านล่างนำประเภทข้อมูลที่ซับซ้อนสามประเภทมารวมไว้ในตารางเดียวกัน เพื่อให้สามารถมองเห็นเงื่อนไขตัวคั่นและไวยากรณ์การเข้าถึงได้พร้อมกัน
CREATE TABLE employees ( name STRING, skills ARRAY<STRING>, deductions MAP<STRING, FLOAT>, address STRUCT<street:STRING, city:STRING, pin:INT> ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' COLLECTION ITEMS TERMINATED BY ',' MAP KEYS TERMINATED BY ':' LINES TERMINATED BY '\n' STORED AS TEXTFILE;
จำเป็นต้องใช้ตัวคั่นสามตัวแยกกันในที่นี้ ได้แก่ ตัวคั่นระหว่างคอลัมน์ ตัวคั่นระหว่างรายการของ ARRAY หรือ STRUCT และตัวคั่นระหว่างคีย์ของ MAP กับค่าของมัน เมื่อตารางมีอยู่แล้ว แต่ละคอลัมน์ที่ซับซ้อนจะถูกอ่านด้วยตัวเข้าถึงเฉพาะของตัวเอง
SELECT name, skills[0], deductions['tax'], address.city FROM employees;
ตารางด้านล่างสรุปว่าตัวเข้าถึงข้อมูลแต่ละชนิดจัดอยู่ในประเภทใดบ้าง
| ประเภท | วิธีการอ่านค่า |
|---|---|
| อาร์เรย์ | ดัชนีฐานศูนย์ เช่น ทักษะ[0] |
| แผนที่ | ค้นหาคีย์ในวงเล็บเหลี่ยม เช่น การหักลดหย่อน['ภาษี'] |
| โครงสร้าง | การใช้จุดนำหน้าชื่อฟิลด์ เช่น address.city |
| ยูเนียนไทป์ | ไม่ค่อยได้ใช้ เนื่องจากระบบรองรับการสืบค้นข้อมูลยังไม่สมบูรณ์ |
ประเภทข้อมูลที่ซับซ้อนอาจซ้อนกันได้ ดังนั้น ARRAY จึงเป็นเช่นนั้น > เป็นการประกาศคอลัมน์ที่ถูกต้อง เมื่อกำหนดโครงสร้างคอลัมน์เสร็จแล้ว ตารางจะถูกสร้างขึ้นโดยใช้คำสั่งต่างๆ ที่กล่าวถึงในหัวข้อถัดไป Hive สร้าง แก้ไข และลบตาราง.
วิธีสร้างและวางฐานข้อมูลใน Hive
ฐานข้อมูลใน Hive เป็นเพียงเนมสเปซที่จัดกลุ่มตาราง ดังนั้นจึงเป็นวัตถุแรกที่ต้องสร้างก่อนที่จะเริ่มทำงานกับตารางใดๆ ต่อไปนี้คือขั้นตอนในการสร้างและลบฐานข้อมูลใน Hive
ขั้นตอนที่ 1) สร้างฐานข้อมูลใน Hive
ในการสร้างฐานข้อมูลใน Hive shell เราต้องใช้คำสั่งตามไวยากรณ์ที่แสดงด้านล่างนี้:
ไวยากรณ์:
Create database <DatabaseName>
ตัวอย่าง: สร้างฐานข้อมูล “guru99”
ภาพหน้าจอด้านล่างแสดงคำสั่งสร้างตามด้วยคำสั่งแสดงรายการฐานข้อมูลทั้งหมดในคลัสเตอร์
จากภาพหน้าจอข้างต้น เรากำลังทำสองสิ่งต่อไปนี้:
- การสร้างฐานข้อมูล “guru99” ใน Hive
- การแสดงฐานข้อมูลที่มีอยู่โดยใช้คำสั่ง “show”
ในหน้าจอเดียวกัน เมื่อรันคำสั่ง show จะแสดงฐานข้อมูล “guru99” ซึ่งหมายความว่าฐานข้อมูล “guru99” ถูกสร้างขึ้นสำเร็จแล้ว
ขั้นตอนที่ 2) ลบฐานข้อมูลใน Hive
สำหรับหยดน้ำping ในการลบฐานข้อมูลใน Hive shell เราต้องใช้คำสั่ง "drop" ตามไวยากรณ์ที่แสดงด้านล่าง:
ไวยากรณ์:
Drop database <DatabaseName>
ตัวอย่าง: ลบฐานข้อมูล guru99
ในภาพหน้าจอถัดไป คำสั่ง drop จะทำงานก่อน และคำสั่ง show ที่ตามมาจะไม่แสดงรายการฐานข้อมูลอีกต่อไป
ในภาพหน้าจอข้างต้น เรากำลังทำสองสิ่งต่อไปนี้:
- เรากำลังทิ้งping ฐานข้อมูล 'guru99' จาก Hive
- ตรวจสอบความถูกต้องอีกครั้งด้วยคำสั่ง “show”
ในหน้าจอเดียวกัน หลังจากตรวจสอบฐานข้อมูลด้วยคำสั่ง show แล้ว ฐานข้อมูล “guru99” ไม่ปรากฏใน Hive ดังนั้นเราจึงยืนยันได้ว่าฐานข้อมูล “guru99” ถูกลบไปแล้ว
คำสั่งฐานข้อมูล Hive: USE, DESCRIBE, SHOW และ ALTER DATABASE
คำสั่งสองคำสั่งข้างต้นใช้รูปแบบที่สั้นที่สุด ไวยากรณ์ที่บันทึกไว้มีข้อความเพิ่มเติมที่ไม่บังคับ ซึ่งจะกำหนดว่าไฟล์จะถูกจัดเก็บไว้ที่ใด และจะเกิดอะไรขึ้นเมื่อชื่อไฟล์นั้นถูกใช้ไปแล้ว
CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES (property_name=property_value, ...)];
DROP DATABASE [IF EXISTS] database_name [RESTRICT|CASCADE];
คำหลัก DATABASE และ SCHEMA สามารถใช้แทนกันได้ตลอดทั้งเอกสาร ดังนั้น CREATE SCHEMA และ CREATE DATABASE จึงทำหน้าที่เหมือนกันทุกประการ ส่วนคำสั่งที่เหลือเป็นคำสั่งเสริมสำหรับการทำงานประจำวันเกี่ยวกับเนมสเปซ
| คำสั่ง | สิ่งที่มันไม่ |
|---|---|
| แสดงฐานข้อมูล; | แสดงรายการฐานข้อมูลทั้งหมดที่ลงทะเบียนในเมตาสโตร์ |
| ใช้ฐานข้อมูล_name; | ตั้งค่าฐานข้อมูลปัจจุบันเพื่อให้ชื่อตารางไม่ต้องมีคำนำหน้า |
| DESCRIBE DATABASE database_name; | รายงานความคิดเห็น ตำแหน่งที่ตั้งของ HDFS และเจ้าของ |
| DESCRIBE DATABASE EXTENDED database_name; | เพิ่มคู่คีย์-ค่าของ DBPROPERTIES ลงในผลลัพธ์นั้น |
| ALTER DATABASE database_name SET DBPROPERTIES (…); | เพิ่มหรือแทนที่คุณสมบัติเมตาเดตา |
| ALTER DATABASE database_name SET OWNER USER user_name; | โอนสิทธิ์การเป็นเจ้าของให้กับผู้ใช้หรือบทบาทอื่น |
| ALTER DATABASE database_name SET LOCATION hdfs_path; | เปลี่ยนแปลงเส้นทางที่ใช้โดยตารางที่สร้างขึ้นนับจากนั้นเป็นต้นไป |
มีค่าเริ่มต้นสองอย่างที่ควรจดจำ หากไม่มีเงื่อนไข LOCATION ไฟล์จะอยู่ในไดเร็กทอรี warehouse ซึ่งโดยปกติคือ /user/hive/warehouse/database_name.db และหากไม่มีเงื่อนไข IF EXISTS การลบไฟล์ไปยังชื่อที่หายไปจะทำให้เกิดข้อผิดพลาดแทนที่จะผ่านไปได้โดยไม่มีปัญหา การตั้งค่าทั้งสองนี้ถูกเก็บไว้ในไฟล์ เมตาสโตร์ของ Hive.
การแปลงประเภทข้อมูลและข้อผิดพลาดที่พบบ่อยใน Hive
ประเภทข้อมูลไม่ได้ถูกใช้งานตรงตามที่ประกาศไว้เสมอไป Hive จะขยายค่าโดยอัตโนมัติเมื่อไม่สามารถสูญเสียข้อมูลใดๆ ได้ และปล่อยให้การแปลงค่าในกรณีอื่นๆ เป็นไปตามวิธีการที่กำหนดไว้
- การขยายขนาดโดยปริยายเป็นไปตามลำดับ TINYINT ไป SMALLINT ไป INT ไป BIGINT ไป FLOAT ไป DOUBLE และ STRING ที่เก็บตัวเลขจะถูกแปลงเป็น DOUBLE
- การลดขนาดข้อมูลจะไม่เกิดขึ้นเองโดยอัตโนมัติ ดังนั้นค่า DOUBLE ที่กำหนดค่าให้กับคอลัมน์ INT จึงจำเป็นต้องมีการแปลงค่าด้วยการเขียนโค้ด
- ฟังก์ชัน CAST จะทำการแปลงค่าตามที่เขียนไว้ และจะส่งคืนค่า NULL แทนที่จะเป็นข้อผิดพลาด หากไม่สามารถแปลงค่าได้
SELECT CAST(salary AS DECIMAL(10,2)) FROM employees;
ข้อผิดพลาดด้านล่างนี้เป็นสาเหตุหลักที่ทำให้ผู้เริ่มต้นพบเจอปัญหาโดยไม่คาดคิดเมื่อใช้งานสคีมาครั้งแรก
| อาการ | สาเหตุและวิธีแก้ไข |
|---|---|
| การลบข้อมูลล้มเหลวในขณะที่ฐานข้อมูลยังคงมีตารางอยู่ | RESTRICT เป็นค่าเริ่มต้น หากต้องการลบตารางทั้งหมด ให้เพิ่ม CASCADE ต่อท้าย |
| เชือกเส้นยาวถูกตัดให้สั้นลง | ตัวแปร VARCHAR จะตัดทอนค่าโดยอัตโนมัติเมื่อเกินความยาวที่กำหนดไว้ ควรใช้ตัวแปร STRING เมื่อไม่ต้องการกำหนดขีดจำกัดความยาว |
| หลังจากแปลงค่าแล้ว คอลัมน์หนึ่งแสดงค่าเป็น NULL | ฟังก์ชัน CAST ไม่สามารถแยกวิเคราะห์ค่าได้ โปรดตรวจสอบข้อมูลต้นฉบับก่อนขยายประเภท |
| ค่าเงินจะสูญเสียหน่วยสตางค์หรือเซนต์ไป | DECIMAL ที่ไม่มีอาร์กิวเมนต์หมายถึง DECIMAL(10,0) ระบุมาตราส่วนอย่างชัดเจน |
| วันที่หน้าตาเหมือนกันสองวันไม่มีทางตรงกันได้ | คอลัมน์วันที่แบบ STRING และคอลัมน์วันที่แบบ DATE เป็นประเภทข้อมูลที่แตกต่างกัน ควรแปลงประเภทข้อมูลด้านใดด้านหนึ่งก่อนทำการเปรียบเทียบ |
เมื่อกำหนดรูปแบบข้อมูลได้แล้ว ขั้นตอนต่อไปคือการโหลดและสอบถามข้อมูล ซึ่งจะกล่าวถึงในหัวข้อถัดไป คำสั่ง SQL ใน Hive ที่มี Order By, Group By และ Cluster By.


