ประเภทข้อมูลไฮฟ์: วิธีสร้างและวางฐานข้อมูลในไฮฟ์

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

ประเภทข้อมูลของ Hive กำหนดว่าแต่ละคอลัมน์ของตารางสามารถเก็บอะไรได้บ้าง และคำสั่ง CREATE DATABASE และ DROP DATABASE จะตั้งค่าหรือลบเนมสเปซที่ตารางเหล่านั้นอยู่ภายในเมตาสโตร์ของ Hive

  • 🔢 ประเภทตัวเลข: TINYINT ถึง BIGINT ครอบคลุมจำนวนเต็ม ในขณะที่ DECIMAL (ความแม่นยำ, สเกล) เก็บค่าที่แน่นอน ซึ่ง FLOAT และ DOUBLE ไม่สามารถทำได้
  • 🔤 ประเภทสตริง: ชนิดข้อมูล STRING ไม่มีการกำหนดขีดจำกัดที่แน่นอน ชนิดข้อมูล VARCHAR รับค่าได้ตั้งแต่ 1 ถึง 65535 ตัวอักษร และชนิดข้อมูล CHAR มีค่าสูงสุดที่ 255 ตัวอักษร
  • 📅 วันและเวลา: ตัวแปร DATE จะเก็บค่า YYYY-MM-DD แบบธรรมดา และตัวแปร TIMESTAMP จะเพิ่มความแม่นยำระดับนาโนวินาทีเข้าไปด้วย (ซึ่งเป็นตัวเลือกเสริม)
  • 🧩 ประเภทที่ซับซ้อน: ARRAY, MAP, STRUCT และ UNIONTYPE จะรวมค่าที่เกี่ยวข้องกันหลายค่าไว้ในคอลัมน์เดียวแทนที่จะกระจายไปหลายคอลัมน์
  • 🏗️ สร้างฐานข้อมูล: คำสั่ง CREATE DATABASE จะลงทะเบียนเนมสเปซในเมตาสโตร์ และคำสั่ง SHOW DATABASES จะยืนยันว่าเนมสเปซนั้นมีอยู่จริง
  • 🗑️ ลบฐานข้อมูล: คำสั่ง DROP DATABASE จะลบเนมสเปซ และจำเป็นต้องใช้คำสั่ง CASCADE ทุกครั้งที่ยังมีตารางอยู่ในเนมสเปซนั้น

ประเภทข้อมูลใน Hive และวิธีการสร้างและลบฐานข้อมูลใน 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”

ภาพหน้าจอด้านล่างแสดงคำสั่งสร้างตามด้วยคำสั่งแสดงรายการฐานข้อมูลทั้งหมดในคลัสเตอร์

Hive shell สร้างฐานข้อมูล guru99 และแสดงรายการฐานข้อมูลด้วยคำสั่ง show

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

  1. การสร้างฐานข้อมูล “guru99” ใน Hive
  2. การแสดงฐานข้อมูลที่มีอยู่โดยใช้คำสั่ง “show”

ในหน้าจอเดียวกัน เมื่อรันคำสั่ง show จะแสดงฐานข้อมูล “guru99” ซึ่งหมายความว่าฐานข้อมูล “guru99” ถูกสร้างขึ้นสำเร็จแล้ว

ขั้นตอนที่ 2) ลบฐานข้อมูลใน Hive

สำหรับหยดน้ำping ในการลบฐานข้อมูลใน Hive shell เราต้องใช้คำสั่ง "drop" ตามไวยากรณ์ที่แสดงด้านล่าง:

ไวยากรณ์:

Drop database <DatabaseName>

ตัวอย่าง: ลบฐานข้อมูล guru99

ในภาพหน้าจอถัดไป คำสั่ง drop จะทำงานก่อน และคำสั่ง show ที่ตามมาจะไม่แสดงรายการฐานข้อมูลอีกต่อไป

เปลือกรังผึ้งร่วงหล่นping ฐานข้อมูล guru99 และยืนยันการลบด้วยคำสั่ง show

ในภาพหน้าจอข้างต้น เรากำลังทำสองสิ่งต่อไปนี้:

  1. เรากำลังทิ้งping ฐานข้อมูล 'guru99' จาก Hive
  2. ตรวจสอบความถูกต้องอีกครั้งด้วยคำสั่ง “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.

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

ไม่ DATABASE และ SCHEMA เป็นคำหลักที่ใช้แทนกันได้ใน HiveQL ดังนั้น CREATE SCHEMA sales และ CREATE DATABASE sales จึงสร้างอ็อบเจ็กต์ metastore เดียวกัน การเลือกใช้คำใดเป็นเพียงเรื่องของรูปแบบการใช้งานภายในองค์กรเท่านั้น

โดยปกติแล้วไฟล์ `/user/hive/warehouse/database_name.db` จะอยู่ในไดเร็กทอรีคลังข้อมูลบน HDFS แต่คำสั่ง `LOCATION` ใน `CREATE DATABASE` จะแทนที่พาธดังกล่าว และคำสั่ง `DESCRIBE DATABASE` จะรายงานพาธที่ถูกใช้งานจริง

โดยทั่วไปแล้ว STRING เป็นตัวเลือกที่นิยมใช้ เพราะไม่มีการกำหนดขีดจำกัดความยาวและไม่จำเป็นต้องเติมช่องว่าง VARCHAR มีประโยชน์เมื่อจำเป็นต้องกำหนดความยาว และ CHAR เหมาะสำหรับรหัสที่มีความกว้างคงที่สั้นๆ เช่น ตัวย่อของประเทศ

DOUBLE คือเลขทศนิยมแบบไบนารี ดังนั้นผลรวมที่ทำซ้ำๆ อาจคลาดเคลื่อนไปบ้างเล็กน้อย ในขณะที่ DECIMAL เก็บค่าที่แน่นอนตามความแม่นยำและมาตราส่วนที่กำหนด ซึ่งทำให้ผลรวมทางการเงินสามารถทำซ้ำได้ในแต่ละครั้ง

TIMESTAMP แบบธรรมดาจะไม่คำนึงถึงเขตเวลาและจะถูกอ่านกลับมาตรงตามที่เขียนไว้ทุกประการ Hive 3.1 ได้เพิ่ม TIMESTAMP WITH LOCAL TIME ZONE ซึ่งจะปรับค่าให้เป็น UTC เมื่อเขียนและแปลงเป็นค่าเดิมเมื่ออ่านกลับมา

ใช่แล้ว STRUCT สามารถอยู่ภายใน ARRAY ได้ และค่าใน MAP ก็อาจเป็น STRUCT ได้เช่นกัน ดังนั้นจึงสามารถอยู่ภายใน ARRAY ได้ > ใช้ได้ใน รังการซ้อนชั้นลึกทำให้การกำหนดขอบเขตซับซ้อนขึ้น ดังนั้นควรซ้อนชั้นตื้นๆ

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

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

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