Hive-datatyper: Hur man skapar och släpper databaser i Hive

⚡ Smart sammanfattning

Hive-datatyper definierar vad varje tabellkolumn kan innehålla, och kommandona CREATE DATABASE och DROP DATABASE konfigurerar eller tar bort namnrymden som dessa tabeller finns i inuti Hive-metaarkivet.

  • 🔢 Numeriska typer: TINYINT till BIGINT täcker heltal, medan DECIMAL(precision, skala) behåller exakta värden som FLOAT och DOUBLE inte kan.
  • 🔤 Strängtyper: STRING har ingen deklarerad gräns, VARCHAR accepterar 1 till 65 535 tecken och CHAR är fast på upp till 255.
  • 📅 Datum och tid: DATE lagrar ett vanligt ÅÅÅÅ-MM-DD-värde och TIMESTAMP lägger till valfri nanosekundprecision ovanpå det.
  • 🧩 Komplexa typer: ARRAY, MAP, STRUCT och UNIONTYPE packar flera relaterade värden i en kolumn istället för många.
  • 🏗️ Skapa en databas: CREATE DATABASE registrerar ett namnutrymme i metaarkivet och SHOW DATABASES bekräftar att det finns.
  • 🗑️ Ta bort en databas: DROP DATABASE tar bort namnrymden, och CASCADE krävs närhelst tabeller fortfarande finns inuti den.

Hive-datatyper och hur man skapar och släpper databaser i Hive

Datatyper är mycket viktiga element i Hive-frågespråk och datamodellering. För att definiera tabellkolumntyper måste vi känna till datatyperna och deras användning.

Följande ger en kort översikt över några datatyper som finns i Hive:

  • Numeriska typer
  • Strängtyper
  • Typer av datum/tid
  • Komplexa typer

Datatyper i Hive

Varje Hive-kolumn deklareras med en av typerna nedan. De primitiva familjerna kommer först, följt av de komplexa typerna som innehåller mer än ett värde i en enda kolumn.

Hive numeriska datatyper

Numeriska kolumner varierar från en enda byte till åtta byte, så att välja den minsta typen som passar värdena håller nere både lagrings- och skanningskostnaden.

Typ Minnesallokering
TINYINT 1-byte signerat heltal (-128 till 127)
SMALLINT 2-byte signerat heltal (-32,768 till 32,767)
INT 4-byte signerat heltal (-2,147,483,648 till 2,147,483,647)
STORT 8-byte signerat heltal (-9,223,372,036,854,775,808 till 9,223,372,036,854,775,807)
FLOTTÖR 4-byte enkel precisionsflyttal
DUBBEL 8-byte dubbel precisionsflyttal
DECIMAL Vi kan definiera precision och skala i den här typen som DECIMAL(precision, skala). När de utelämnas använder Hive DECIMAL(10,0)

Hive Strängdatatyper

Teckenkolumner finns i tre former, och skillnaden är om Hive tillämpar en deklarerad längd.

Typ Längd
RÖDING Fast längd, upp till 255 tecken. Kortare värden fylls ut med mellanslag.
VARCHAR 1 till 65 535 tecken. Ett längre värde avkortas tyst.
STRÄNG Vi kan definiera längd här (ingen gräns)

Hive datum/tid datatyper

Temporala kolumner lagras utan tidszonsförskjutning, vilket är värt att komma ihåg innan man jämför värden som skrivits av olika kluster.

Typ Användning
Tidsstämpel Stöder traditionella Unix tidsstämpel med valfri nanosekundprecision
Datum Den är i formatet ÅÅÅÅ-MM-DD.
Värdeintervallet som stöds för datumtypen är 0000-01-01 till 9999-12-31, beroende på stödet från primitiven. Java typiskt datum

Diverse datatyper i Hive

Två ytterligare primitiver står utanför de numeriska, sträng- och datumfamiljerna men förekommer regelbundet i verkliga scheman.

Typ Användning
BOOLEAN Lagrar sant eller falskt
Binary Lagrar en array med byte, vilket håller rått innehåll borta från en STRING-kolumn

Hive komplexa datatyper

Komplexa typer kapslar värden i en kolumn, vilket tar bort den extra koppling som en relationsdesign skulle behöva.

Typ Användning
arrayer ARRAY
Negativa värden och icke-konstanta uttryck är inte tillåtna
kartor KARTA
Negativa värden och icke-konstanta uttryck är inte tillåtna
structs STRUKTUR
Union UNIONSTYP

Exempel på komplexa Hive-datatyper

Tabellen ovan visar deklarationsformen. Satsen nedan placerar tre av de komplexa typerna i en tabell så att avgränsningsklausulerna och åtkomstsyntaxen kan ses tillsammans.

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;

Tre separata avgränsare behövs här: ett mellan kolumner, ett andra mellan elementen i en ARRAY eller STRUC, och ett tredje mellan en MAP-nyckel och dess värde. När tabellen finns läses varje komplex kolumn med sin egen accessor.

SELECT name, skills[0], deductions['tax'], address.city
FROM employees;

Tabellen nedan sammanfattar vilken accessor som tillhör vilken typ.

Typ Hur ett värde läses
ARRAY Nollbaserat index, såsom färdigheter[0]
KARTA Nyckelsökning inom hakparenteser, till exempel avdrag['skatt']
STRUKT Punktnotation på fältnamnet, till exempel adress.stad
UNIONSTYP Används sällan, eftersom frågesupporten för den har förblivit ofullständig

Komplexa typer kan kapslas, så ARRAY > är en giltig kolumndeklaration. När kolumnlayouten är fastställd byggs själva tabellerna med de satser som täcks av Hive skapar, ändrar och tar bort tabell.

Hur man skapar och släpper databaser i Hive

En databas i Hive är helt enkelt ett namnutrymme som grupperar tabeller, så det är det första objektet som skapas innan något tabellarbete påbörjas. Följande är stegen för hur man skapar och släpper databaser i Hive.

Steg 1) Skapa databas i Hive

För att skapa en databas i Hive-shell måste vi använda kommandot som visas i syntaxen nedan:

Syntax:

Create database <DatabaseName>

Exempel: Skapa databasen “guru99”

Skärmdumpen nedan visar create-kommandot följt av ett show-kommando som listar alla databaser i klustret.

Hive-shell skapar guru99-databasen och listar databaser med show

Från skärmdumpen ovan gör vi två saker:

  1. Skapar databasen "guru99" i Hive
  2. Visa befintliga databaser med kommandot ”visa”

På samma skärm visas databasen "guru99" i slutet av när vi kör kommandot show, vilket betyder att databasen "guru99" har skapats.

Steg 2) Släpp databasen i Hive

För droppeping en databas i Hive-shell måste vi använda kommandot "drop" enligt syntaxen nedan:

Syntax:

Drop database <DatabaseName>

Exempel: Droppa databas guru99

I nästa skärmbild körs drop-kommandot först, och det efterföljande show-kommandot listar inte längre databasen.

Hive skal droppeping guru99-databasen och bekräfta borttagning med show

I skärmdumpen ovan gör vi två saker:

  1. Vi är droppping databasen 'guru99' från Hive
  2. Korskolla samma sak med kommandot "visa"

På samma skärm, efter att ha kontrollerat databaserna med kommandot show, visas inte databasen "guru99" i Hive. Så vi kan nu bekräfta att databasen "guru99" har tagits bort.

Hive-databaskommandon: ANVÄND, BESKRIV, VISA och ÄNDRA DATABAS

De två ovanstående uttrycken använder sin kortaste form. Den dokumenterade syntaxen innehåller valfria klausuler som avgör var filerna hamnar och vad som händer när namnet redan är upptaget.

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];

Nyckelorden DATABASE och SCHEMA är utbytbara genomgående, så CREATE SCHEMA och CREATE DATABASE gör exakt samma sak. De återstående kommandona kompletterar det dagliga arbetet med ett namnutrymme.

Kommando Vad den gör
VISA DATABASER; Listar alla databaser som är registrerade i metaarkivet
ANVÄND databasnamn; Ställer in den aktuella databasen så att tabellnamn inte behöver något prefix
BESKRIV DATABAS databasnamn; Rapporterar kommentaren, HDFS-platsen och ägaren
BESKRIV DATABAS UTÖKAD databasnamn; Lägger till DBPROPERTIES nyckel-värdepar till den utdata
ÄNDRING DATABASE databasnamn SET DBEGENSKAPER (…); Lägger till eller ersätter metadataegenskaper
ÄNDRA DATABASE databasnamn SET ÄGARE ANVÄNDARE användarnamn; Överför ägarskap till en annan användare eller roll
ÄNDRING DATABAS databasnamn ANGE PLATS hdfs_sökväg; Ändrar sökvägen som används av tabeller som skapats från och med då

Två standardvärden är värda att memorera. Utan en LOCATION-klausul finns filerna under warehouse-katalogen, normalt /user/hive/warehouse/database_name.db, och utan IF EXISTS genererar en överföring mot ett saknat namn ett fel istället för att skickas tyst. Båda inställningarna behålls i Hive metastore.

Hive-datatypkonvertering och vanliga fel

Typer används inte alltid exakt som de deklarerat. Hive breddar ett värde automatiskt när ingen information kan gå förlorad och överlåter allt annat till en explicit konvertering.

  • Implicit breddning följer kedjan TINYINT till SMALLINT till INT till BIGINT till FLOAT till DOUBLE, och en STRING som innehåller siffror uppgraderas till DOUBLE.
  • Förträngning sker aldrig av sig själv, så en DOUBLE som tilldelas en INT-kolumn behöver en skriftlig konvertering.
  • CAST utför den skrivna konverteringen och returnerar NULL snarare än ett fel när värdet inte kan konverteras.
SELECT CAST(salary AS DECIMAL(10,2)) FROM employees;

Felen nedan står för de flesta av de överraskningar som nybörjare stöter på i sitt första schema.

Symptom Orsak och åtgärd
Avregistreringen misslyckas medan databasen fortfarande innehåller tabeller RESTRICT är standardinställningen. Lägg till CASCADE för att ta bort tabellerna med den.
En lång sträng anländer förkortad VARCHAR avkortar tyst förbi sin deklarerade längd. Använd STRING när ingen gräns önskas.
En kolumn läses som NULL efter en konvertering CAST kunde inte analysera värdet. Kontrollera källdata innan typen breddas.
Valutavärden förlorar sina pais eller cent DECIMAL utan argument betyder DECIMAL(10,0). Ange skalan explicit
Två identiskt utseende datum matchar aldrig En STRING-datumkolumn och en DATE-kolumn är olika typer. Jämför från ena sidan innan du jämför.

När typerna beter sig är nästa steg att ladda och fråga själva data, vilket behandlas i Hive-frågor med Sortera efter, Gruppera efter och Cluster By.

Vanliga frågor

Nej. DATABASE och SCHEMA är utbytbara nyckelord i HiveQL, så CREATE SCHEMA sales och CREATE DATABASE sales producerar samma metastore-objekt. Valet är helt och hållet en fråga om husstil.

Under warehouse-katalogen, normalt /user/hive/warehouse/database_name.db på HDFS. En LOCATION-klausul på CREATE DATABASE åsidosätter den sökvägen, och DESCRIBE DATABASE rapporterar vilken plats som faktiskt användes.

STRING är det vanliga valet eftersom det inte har någon deklarerad gräns och inte behöver någon utfyllnad. VARCHAR är till hjälp när en längd måste tillämpas, och CHAR passar korta koder med fast bredd, såsom landsförkortningar.

DOUBLE är ett binärt flyttal, så upprepade summor avviker med bråkdelar av en cent. DECIMAL lagrar exakta värden med en angiven precision och skala, vilket gör att finansiella totalsummor kan reproduceras över körningar.

En vanlig TIMESTAMP är tidszonsfri och läses tillbaka exakt som den skrivs. Hive 3.1 lade till TIMESTAMP WITH LOCAL TIDSZONE, vilket normaliserar värdet till UTC vid skrivning och konverterar det vid läsning.

Ja. En STRUCTS kan finnas inuti en ARRAY och ett MAP-värde kan i sig vara en STRUCTS, så ARRAY > är giltigt i BikupaDjup kapsling komplicerar avgränsare, så håll det ytligt.

Ja. Dataprofileringsverktyg samplar kardinalitet, nullfrekvenser och värdeintervall och föreslår sedan den smalaste fungerande typen och ett filformat. Behandla förslaget som ett utkast eftersom modellen inte kan se framtida arbetsbelastningar.

Copilot utarbetar CREATE TABLE- och CREATE DATABASE-satser från en kort kommentar, och agentassistenter kan konvertera en exempelfil till ett schema. Kontrollera alltid DECIMAL-skalan och avgränsningsklausulerna innan du kör resultatet.

Sammanfatta detta inlägg med: