Hive-datatyper: Sådan oprettes og droppes databaser i Hive
⚡ Smart opsummering
Hive-datatyper definerer, hvad hver tabelkolonne kan indeholde, og kommandoerne CREATE DATABASE og DROP DATABASE opretter eller fjerner det navneområde, som disse tabeller findes i, inde i Hive-metastoren.

Datatyper er meget vigtige elementer i Hive-forespørgselssprog og datamodellering. For at definere tabelkolonnetyper skal vi have kendskab til datatyperne og deres anvendelse.
Følgende giver en kort oversigt over nogle datatyper, der findes i Hive:
- Numeriske typer
- Strengtyper
- Dato/klokkeslætstyper
- Komplekse typer
Datatyper i Hive
Hver Hive-kolonne er deklareret med en af typerne nedenfor. De primitive familier kommer først, efterfulgt af de komplekse typer, der indeholder mere end én værdi i en enkelt kolonne.
Hive numeriske datatyper
Numeriske kolonner spænder fra en enkelt byte til otte bytes, så at vælge den mindste type, der passer til værdierne, holder både lager- og scanningsomkostningerne nede.
| Type | Hukommelsestildeling |
|---|---|
| TINYINT | 1-byte signeret heltal (-128 til 127) |
| SMALLINT | 2-byte signeret heltal (-32,768 til 32,767) |
| INT | 4-byte signeret heltal (-2,147,483,648 til 2,147,483,647) |
| STORT | 8-byte signeret heltal (-9,223,372,036,854,775,808 til 9,223,372,036,854,775,807) |
| FLOAT | 4-byte enkelt præcisions flydende kommatal |
| DOBBELT | 8-byte dobbelt præcisions flydende kommatal |
| DECIMAL | Vi kan definere præcision og skala i denne type som DECIMAL(præcision, skala). Når de udelades, bruger Hive DECIMAL(10,0) |
Hive-strengdatatyper
Tegnkolonner findes i tre former, og forskellen er, om Hive håndhæver en deklareret længde.
| Type | Længde |
|---|---|
| CHAR | Fast længde, op til 255 tegn. Kortere værdier udfyldes med mellemrum |
| VARCHAR | 1 til 65,535 tegn. En længere værdi afkortes lydløst |
| STRING | Vi kan definere længden her (ingen grænse) |
Hive Dato/Tid Datatyper
Midlertidige kolonner gemmes uden tidszoneforskydning, hvilket er værd at huske på, før man sammenligner værdier skrevet af forskellige klynger.
| Type | Brug |
|---|---|
| Timestamp | Understøtter traditionelle Unix tidsstempel med valgfri nanosekund præcision |
| Dato | Den er i formatet ÅÅÅÅ-MM-DD. Det understøttede værdiinterval for datotypen er 0000-01-01 til 9999-12-31, afhængigt af understøttelsen fra primitiven. Java typisk dato |
Diverse Hive-datatyper
To yderligere primitiver ligger uden for de numeriske, streng- og datofamilier, men optræder regelmæssigt i virkelige skemaer.
| Type | Brug |
|---|---|
| BOOLESK | Gemmer sandt eller falsk |
| Binary | Gemmer et array af bytes, hvilket holder råt indhold ude af en STRING-kolonne |
Hive komplekse datatyper
Komplekse typer indlejrer værdier i én kolonne, hvilket fjerner den ekstra join, som et relationelt design ville have brug for.
| Type | Brug |
|---|---|
| Arrays | ARRA Negative værdier og ikke-konstante udtryk er ikke tilladt |
| Maps | KORT Negative værdier og ikke-konstante udtryk er ikke tilladt |
| Strukturer | STRUKTUR |
| Union | UNIONSTYPE |
Eksempel på komplekse Hive-datatyper
Tabellen ovenfor viser deklarationsformen. Sætningen nedenfor sætter tre af de komplekse typer i én tabel, så afgrænsningsklausulerne og adgangssyntaksen kan ses sammen.
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 separate afgrænsere er nødvendige her: en mellem kolonner, en anden mellem elementerne i et ARRAY eller en STRUCTS, og en tredje mellem en MAP-nøgle og dens værdi. Når tabellen findes, læses hver kompleks kolonne med sin egen accessor.
SELECT name, skills[0], deductions['tax'], address.city FROM employees;
Tabellen nedenfor opsummerer, hvilken accessor der tilhører hvilken type.
| Type | Hvordan en værdi aflæses |
|---|---|
| ARRA | Nulbaseret indeks, såsom færdigheder[0] |
| MAP | Nøgleopslag i firkantede parenteser, såsom fradrag['skat'] |
| STRUKT | Punktumnotation på feltnavnet, f.eks. adresse.by |
| UNIONSTYPE | Bruges sjældent, fordi forespørgselsunderstøttelsen til den har været ufuldstændig |
Komplekse typer kan indlejres, så ARRAY > er en gyldig kolonnedeklaration. Når kolonnelayoutet er fastlagt, bygges selve tabellerne med de udsagn, der er dækket i Opret, rediger og slet tabel i Hive.
Sådan opretter og dropper du databaser i Hive
En database i Hive er simpelthen et navnerum, der grupperer tabeller, så det er det første objekt, der oprettes, før noget tabelarbejde begynder. Følgende er trinnene til, hvordan du opretter og sletter databaser i Hive.
Trin 1) Opret database i Hive
For at oprette en database i Hive Shell skal vi bruge kommandoen som vist i syntaksen nedenfor:
Syntaks:
Create database <DatabaseName>
Eksempel: Opret databasen “guru99”
Skærmbilledet nedenfor viser create-kommandoen efterfulgt af en show-kommando, der viser alle databaser i klyngen.
Ud fra ovenstående skærmbillede gør vi to ting:
- Oprettelse af database "guru99" i Hive
- Visning af eksisterende databaser ved hjælp af kommandoen "show"
På samme skærm vises databasen “guru99” til sidst, når vi udfører show-kommandoen, hvilket betyder, at databasen “guru99” er oprettet.
Trin 2) Drop databasen i Hive
Til dropping en database i Hive shell, skal vi bruge kommandoen "drop" som vist i syntaksen nedenfor:
Syntaks:
Drop database <DatabaseName>
Eksempel: Drop database guru99
I det næste skærmbillede køres drop-sætningen først, og den efterfølgende show-kommando viser ikke længere databasen.
I skærmbilledet ovenfor gør vi to ting:
- Vi er faldetping databasen 'guru99' fra Hive
- Krydstjek det samme med kommandoen "vis"
På samme skærm, efter at have kontrolleret databaserne med show-kommandoen, vises databasen "guru99" ikke i Hive. Så vi kan nu bekræfte, at databasen "guru99" er slettet.
Hive-databasekommandoer: BRUG, BESKRIV, VIS og ÆNDRE DATABASE
De to ovenstående udsagn bruger deres korteste form. Den dokumenterede syntaks indeholder valgfrie klausuler, der bestemmer, hvor filerne lander, og hvad der sker, når navnet allerede er optaget.
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];
Nøgleordene DATABASE og SCHEMA kan bruges i samme rækkefølge, så CREATE SCHEMA og CREATE DATABASE gør præcis det samme. De resterende kommandoer fuldender det daglige arbejde med et navnerum.
| Kommando | Hvad gør den |
|---|---|
| VIS DATABASER; | Viser en liste over alle databaser, der er registreret i metastoren |
| BRUG databasenavn; | Indstiller den aktuelle database, så tabelnavne ikke behøver præfiks |
| BESKRIV DATABASE database_navn; | Rapporterer kommentaren, HDFS-placeringen og ejeren |
| BESKRIV DATABASEUDVIDET databasenavn; | Tilføjer DBPROPERTIES nøgle-værdi-parrene til det pågældende output |
| ÆNDR DATABASE database_navn SÆT DBEGENSKABER (…); | Tilføjer eller erstatter metadataegenskaber |
| ÆNDR DATABASE database_navn SÆT EJER BRUGER bruger_navn; | Overfører ejerskab til en anden bruger eller rolle |
| ÆNDR DATABASE database_navn ANGIV PLACERING hdfs_sti; | Ændrer den sti, der bruges af tabeller, der er oprettet fra da af |
To standardindstillinger er værd at huske. Uden en LOCATION-klausul ligger filerne under warehouse-mappen, normalt /user/hive/warehouse/database_name.db, og uden IF EXISTS genererer et drop mod et manglende navn en fejl i stedet for at ske stille og roligt. Begge indstillinger bevares i Hive-metastore.
Hive-datatypekonvertering og almindelige fejl
Typer bruges ikke altid præcis som deklareret. Hive udvider automatisk en værdi, når ingen information kan gå tabt, og overlader alt andet til en eksplicit konvertering.
- Implicit udvidelse følger kæden TINYINT til SMALLINT til INT til BIGINT til FLOAT til DOUBLE, og en STRING, der indeholder cifre, forfremmes til DOUBLE.
- Indsnævring sker aldrig af sig selv, så en DOUBLE tildelt en INT-kolonne kræver en skriftlig konvertering.
- CAST udfører den skrevne konvertering, og den returnerer NULL i stedet for en fejl, når værdien ikke kan konverteres.
SELECT CAST(salary AS DECIMAL(10,2)) FROM employees;
Fejlene nedenfor forklarer de fleste af de overraskelser, som begyndere møder på deres første skema.
| Symptom | Årsag og løsning |
|---|---|
| Dropning mislykkes, mens databasen stadig indeholder tabeller | RESTRICT er standardindstillingen. Tilføj CASCADE for at slette tabellerne med den. |
| En lang streng ankommer forkortet | VARCHAR afkorter lydløst ud over sin deklarerede længde. Brug STRING, når der ikke ønskes nogen grænse. |
| En kolonne læses som NULL efter en konvertering | CAST kunne ikke analysere værdien. Kontroller kildedataene, før typen udvides. |
| Valutaværdier mister deres paise eller cents | DECIMAL uden argumenter betyder DECIMAL(10,0). Angiv skalaen eksplicit |
| To identisk udseende datoer matcher aldrig | En STRING-datokolonne og en DATE-kolonne er forskellige typer. Kast den ene side, før du sammenligner. |
Når typerne opfører sig korrekt, er næste trin at indlæse og forespørge selve dataene, hvilket er dækket i Hive-forespørgsler med Sortér efter, Gruppér efter og Cluster By.


