Hive-datatyper: Hvordan lage og slippe databaser i Hive

⚡ Smart oppsummering

Hive-datatyper definerer hva hver tabellkolonne kan inneholde, og kommandoene CREATE DATABASE og DROP DATABASE setter opp eller fjerner navneområdet disse tabellene befinner seg i i Hive-metastoren.

  • 🔢 Numeriske typer: TINYINT til BIGINT dekker hele tall, mens DECIMAL(presisjon, skala) beholder eksakte verdier som FLOAT og DOUBLE ikke kan.
  • 🔤 Strengtyper: STRING har ingen deklarert grense, VARCHAR godtar 1 til 65 535 tegn, og CHAR er fastsatt til opptil 255.
  • 📅 Dato og tid: DATE lagrer en vanlig YYYY-MM-DD-verdi, og TIMESTAMP legger til valgfri nanosekundpresisjon i tillegg.
  • 🧩 Komplekse typer: ARRAY, MAP, STRUCT og UNIONTYPE pakker flere relaterte verdier inn i én kolonne i stedet for mange.
  • 🏗️ Opprett en database: CREATE DATABASE registrerer et navneområde i metastoren, og SHOW DATABASES bekrefter at det finnes.
  • 🗑️ Slett en database: DROP DATABASE fjerner navnerommet, og CASCADE er nødvendig når tabeller fortsatt finnes i det.

Hive-datatyper og hvordan du oppretter og sletter databaser i Hive

Datatyper er svært viktige elementer i Hive-spørrespråket og datamodelleringen. For å definere tabellkolonnetyper må vi kjenne til datatypene og bruken av dem.

Følgende gir en kort oversikt over noen datatyper som finnes i Hive:

  • Numeriske typer
  • Strengetyper
  • Dato/klokkesletttyper
  • Komplekse typer

Datatyper i Hive

Hver Hive-kolonne deklareres med en av typene nedenfor. De primitive familiene kommer først, etterfulgt av de komplekse typene som inneholder mer enn én verdi i en enkelt kolonne.

Hive numeriske datatyper

Numeriske kolonner varierer fra én byte til åtte byte, så å velge den minste typen som passer til verdiene holder både lagrings- og skannekostnadene nede.

typen Minneallokering
TINYINT 1-byte signert heltall (-128 til 127)
SMALLINT 2-byte signert heltall (-32,768 til 32,767)
INT 4-byte signert heltall (-2,147,483,648 til 2,147,483,647)
STORT 8-byte signert heltall (-9,223,372,036,854,775,808 til 9,223,372,036,854,775,807)
FLOAT 4-byte enkelt presisjonsflyttall
DOBBELT 8-byte dobbel presisjonsflyttall
DESIMAL Vi kan definere presisjon og skala i denne typen som DECIMAL(presisjon, skala). Når de utelates, bruker Hive DECIMAL(10,0)

Hive-strengdatatyper

Tegnkolonner finnes i tre former, og forskjellen er om Hive håndhever en deklarert lengde.

typen Lengde
CHAR Fast lengde, opptil 255 tegn. Kortere verdier fylles ut med mellomrom.
VARCHAR 1 til 65 535 tegn. En lengre verdi blir avkortet i stillhet.
STRING Vi kan definere lengde her (ingen grense)

Hive Dato/Tid-datatyper

Midlertidige kolonner lagres uten tidssoneforskyvning, noe som er verdt å huske på før man sammenligner verdier skrevet av forskjellige klynger.

typen bruk
Tidsstempel Støtter tradisjonelle Unix tidsstempel med valgfri nanosekund-presisjon
Dato Den er i formatet ÅÅÅÅ-MM-DD.
Verdiområdet som støttes for datotypen er 0000-01-01 til 9999-12-31, avhengig av støtten fra primitivet. Java typisk dato

Diverse datatyper i Hive

To ytterligere primitiver sitter utenfor tall-, streng- og datofamiliene, men vises regelmessig i virkelige skjemaer.

typen bruk
boolsk Lagrer sant eller usant
BINARY Lagrer en rekke byte, som holder rått innhold ute av en STRING-kolonne

Hive komplekse datatyper

Komplekse typer nester verdier i én kolonne, noe som fjerner den ekstra sammenføyningen som et relasjonelt design ville trenge.

typen bruk
arrays ARRAY
Negative verdier og ikke-konstante uttrykk er ikke tillatt
Kart KART
Negative verdier og ikke-konstante uttrykk er ikke tillatt
Strukturer STRUKTUR
Union UNIONSTYPE

Eksempel på komplekse Hive-datatyper

Tabellen ovenfor viser deklarasjonsformen. Utsagnet nedenfor setter tre av de komplekse typene i én tabell, slik at skilleklausulene og tilgangssyntaksen kan sees 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 skilletegn er nødvendig her: ett mellom kolonner, et andre mellom elementene i en ARRAY eller STRUC, og et tredje mellom en MAP-nøkkel og dens verdi. Når tabellen finnes, leses hver kompleks kolonne med sin egen aksessor.

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

Tabellen nedenfor oppsummerer hvilken aksessor som tilhører hvilken type.

typen Hvordan en verdi leses
ARRAY Nullbasert indeks, som ferdigheter[0]
MAP Nøkkeloppslag i hakeparenteser, for eksempel fradrag['skatt']
STRUKT Punktnotasjon på feltnavnet, for eksempel adresse.by
UNIONSTYPE Sjelden brukt, fordi spørrestøtten for den har vært ufullstendig

Komplekse typer kan være nestet, så ARRAY > er en gyldig kolonnedeklarasjon. Når kolonneoppsettet er avgjort, bygges selve tabellene med setningene som er dekket i Hive oppretter, endrer og sletter tabeller.

Hvordan lage og slippe databaser i Hive

En database i Hive er rett og slett et navnerom som grupperer tabeller, så det er det første objektet som opprettes før noe tabellarbeid starter. Følgende er trinnene for hvordan du oppretter og sletter databaser i Hive.

Trinn 1) Opprett database i Hive

For å opprette en database i Hive-shellet, må vi bruke kommandoen som vist i syntaksen nedenfor:

Syntaks:

Create database <DatabaseName>

Eksempel: Opprett databasen «guru99»

Skjermbildet nedenfor viser create-setningen etterfulgt av en show-kommando som viser alle databasene i klyngen.

Hive-shell oppretter guru99-databasen og lister databaser med show

Fra skjermbildet ovenfor gjør vi to ting:

  1. Oppretter database "guru99" i Hive
  2. Vise eksisterende databaser ved hjelp av kommandoen «vis»

På samme skjerm vises databasen «guru99» på slutten når vi utfører show-kommandoen, som betyr at databasen «guru99» er opprettet.

Trinn 2) Slipp databasen i Hive

For slippping en database i Hive-shell, må vi bruke «drop»-kommandoen som vist i syntaksen nedenfor:

Syntaks:

Drop database <DatabaseName>

Eksempel: Slett database guru99

I neste skjermbilde kjøres drop-setningen først, og show-kommandoen som følger viser ikke lenger databasen.

Hive skalldråpeping guru99-databasen og bekrefter fjerning med show

I skjermbildet ovenfor gjør vi to ting:

  1. Vi er droppping databasen 'guru99' fra Hive
  2. Kryssjekk det samme med «vis»-kommandoen

På samme skjermbilde, etter å ha sjekket databasene med show-kommandoen, vises ikke databasen «guru99» i Hive. Så vi kan nå bekrefte at databasen «guru99» er slettet.

Hive-databasekommandoer: BRUK, BESKRIV, VIS og ENDR DATABASE

De to setningene ovenfor bruker sin korteste form. Den dokumenterte syntaksen inneholder valgfrie klausuler som bestemmer hvor filene havner og hva som skjer når navnet allerede er tatt.

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økkelordene DATABASE og SCHEMA er utskiftbare gjennomgående, så CREATE SCHEMA og CREATE DATABASE gjør akkurat det samme. De resterende kommandoene avrunder det daglige arbeidet med et navnerom.

Kommando Hva det gjør
VIS DATABASER; Viser alle databaser som er registrert i metastoren
BRUK databasenavn; Angir gjeldende database slik at tabellnavn ikke trenger prefiks
BESKRIV DATABASE databasenavn; Rapporterer kommentaren, HDFS-plasseringen og eieren
BESKRIV DATABASE UTVIDET databasenavn; Legger til DBPROPERTIES nøkkelverdipar til den utdataene
ENDRE DATABASE database_navn ANGI DBEGENSKAPER (…); Legger til eller erstatter metadataegenskaper
ENDRE DATABASE database_navn ANGI EIER BRUKER bruker_navn; Overfører eierskap til en annen bruker eller rolle
ENDRE DATABASE database_navn ANGI PLASSERING hdfs_sti; Endrer banen som brukes av tabeller som er opprettet fra da av

To standardinnstillinger er verdt å huske. Uten en LOCATION-klausul ligger filene under lagerkatalogen, vanligvis /user/hive/warehouse/database_name.db, og uten IF EXISTS genererer en feilmelding en mot et manglende navn i stedet for å gå stille. Begge innstillingene beholdes i Hive-metabutikk.

Hive-datatypekonvertering og vanlige feil

Typer brukes ikke alltid nøyaktig som deklarert. Hive utvider en verdi automatisk når ingen informasjon kan gå tapt, og overlater alt annet til en eksplisitt konvertering.

  • Implisitt utvidelse følger kjeden TINYINT til SMALLINT til INT til BIGINT til FLOAT til DOUBLE, og en STRING som inneholder sifre forfremmes til DOUBLE.
  • Innsnevring skjer aldri av seg selv, så en DOUBLE som er tilordnet en INT-kolonne, trenger en skriftlig konvertering.
  • CAST utfører den skrevne konverteringen, og den returnerer NULL i stedet for en feil når verdien ikke kan konverteres.
SELECT CAST(salary AS DECIMAL(10,2)) FROM employees;

Feilene nedenfor forklarer de fleste overraskelsene nybegynnere møter på sitt første skjema.

Symptom Årsak og løsning
Slettingen mislykkes mens databasen fortsatt inneholder tabeller RESTRICT er standardinnstillingen. Legg til CASCADE for å fjerne tabellene med den.
En lang streng ankommer forkortet VARCHAR avkortes stille forbi den deklarerte lengden. Bruk STRING når ingen grense er ønsket.
En kolonne leses som NULL etter en konvertering CAST kunne ikke analysere verdien. Sjekk kildedataene før du utvider typen.
Valutaverdier mister sine paiser eller cent DESIMAL uten argumenter betyr DESIMAL(10,0). Angi skalaen eksplisitt
To identisk utseende datoer stemmer aldri overens En STRING-datokolonne og en DATE-kolonne er forskjellige typer. Kast den ene siden før du sammenligner.

Når typene oppfører seg, er neste trinn å laste inn og spørre selve dataene, som dekkes i Hive-spørringer med Sorter etter, Grupper etter og Cluster By.

Spørsmål og svar

Nei. DATABASE og SCHEMA er utskiftbare nøkkelord i HiveQL, så CREATE SCHEMA sales og CREATE DATABASE sales produserer det samme metastore-objektet. Valget er utelukkende et spørsmål om husstil.

Under lagerkatalogen, vanligvis /user/hive/warehouse/database_name.db på HDFS. En LOCATION-klausul på CREATE DATABASE overstyrer den banen, og DESCRIBE DATABASE rapporterer hvilken plassering som faktisk ble brukt.

STRING er det vanlige valget fordi det ikke har noen deklarert grense og ikke trenger utfylling. VARCHAR hjelper når en lengde må håndheves, og CHAR passer til korte koder med fast bredde, som for eksempel landsforkortelser.

DOUBLE er binær flyttall, så gjentatte summer avviker med brøkdeler av en cent. DESIMAL lagrer eksakte verdier med en gitt presisjon og skala, noe som gjør økonomiske totaler reproduserbare på tvers av kjøringer.

Et vanlig TIMESTAMP er tidssonefritt og leses tilbake nøyaktig som skrevet. Hive 3.1 la til TIMESTAMP MED LOKAL TIDSSONE, som normaliserer verdien til UTC ved skriving og konverterer den ved lesing.

Ja. En STRUCTS kan ligge i en ARRAY, og en MAP-verdi kan i seg selv være en STRUCTS, så ARRAY > er gyldig i HiveDyp nesting kompliserer skilletegn, så hold det overfladisk.

Ja. Dataprofileringsverktøy tar prøver av kardinalitet, nullrater og verdiområder, og foreslår deretter den smaleste brukbare typen og et filformat. Behandle forslaget som et utkast, fordi modellen ikke kan se fremtidige arbeidsbelastninger.

Copilot utkaster CREATE TABLE- og CREATE DATABASE-setninger fra en kort kommentar, og agentassistenter kan konvertere en eksempelfil til et skjema. Sjekk alltid DECIMAL-skalaen og skilletegnklausulene før du kjører resultatet.

Oppsummer dette innlegget med: