Zephyrnet-logo

Beginnershandleiding voor gegevenspartitionering in HiveQL

Datum:

Dit artikel is gepubliceerd als onderdeel van het Data Science-blogathon.

Introductie

Facebook creëerde een bijenkorf, maar deze werd uiteindelijk opgepikt door de Apache Software Foundation en ontwikkeld als een open-sourceproject onder de naam Apache Hive. Het wordt gebruikt door verschillende bedrijven. Amazon gebruikt het in Amazon Elastic MapReduce. Laten we een korte discussie hebben over partitionering in de bijenkorf.

Wat is partitioneren?

Partitionering is een Hive-optimalisatietechniek die de snelheid drastisch verbetert. Apache Hive is een op Hadoop gebaseerd datawarehouse dat ad-hocanalyse van gestructureerde en semi-gestructureerde gegevens mogelijk maakt. Laten we de Apache Hive-partitionering eens bekijken.

Hive Partitie

We hebben tabellen in partities verdeeld met behulp van Apache Hive. Partitioneren verdeelt een tabel in secties op basis van de waarden van specifieke kolommen, zoals datum, plaats en afdeling.

Om een ​​bepaalde partitie te identificeren, kan elke tabel in de component een of meer partitiesleutels hebben. Het is eenvoudig om query's uit te voeren op gegevenssegmenten wanneer u partitie gebruikt.

Gegevenspartitionering in HiveQL

Bron: Beeld

Is partitioneren belangrijk?

We weten dat HDFS een enorme hoeveelheid gegevens opslaat, misschien in het petabytebereik. Als gevolg hiervan wordt het opvragen van deze enorme hoeveelheid gegevens behoorlijk moeilijk voor Hadoop-gebruikers.

De Hive verlichtte de belasting van het opvragen van gegevens. We zetten de SQL-query's om in MapReduce-taken, die vervolgens met behulp van Apache Hive naar het Hadoop-cluster worden verzonden. Hive leest de volledige dataset wanneer we een SQL-query indienen.

Als gevolg hiervan wordt het inefficiënt om MapReduce-taken over een enorme tafel uit te voeren. Als gevolg hiervan worden partities in tabellen gebruikt om het probleem aan te pakken. Door automatisch divisies te construeren op het moment van tafelvorming, maakt Apache Hive het implementeren van partities relatief eenvoudig.

Partities maken in Hive

De volgende opdracht wordt gebruikt om gegevenspartitionering in Hive te maken:

MAAK TABEL tabelnaam (kolom1 data_type, kolom2 data_type) GEPARTITIONEERD DOOR (partitie1 data_type, partitie2 data_type,….);

Statische partitie in HIVE

Bij statische partitionering moeten we handmatig beslissen hoeveel partities elke tabel zal hebben, evenals hun waarden. Overweeg het volgende scenario: we hebben een werknemerstabel die we willen splitsen op afdelingsnaam. Er zijn maar een paar afdelingen, dus er zijn maar een paar partities.

Een van de belangrijkste nadelen van statische partitionering is dat, terwijl we gegevens in een partitie laden, we ervoor zorgen dat we de juiste gegevens in de juiste partitie laden. In onderstaand voorbeeld moeten we ervoor zorgen dat het bestand bij het importeren alleen HR-gegevens bevat. (Zie deze pagina voor meer informatie over de opdracht Hive laden.)

MAAK EXTERNE TABEL employee_dept (emp_id INT, emp_name STRING ) GEPARTITIONEERD DOOR ( dept_name STRING ) locatie '/user/employee_dept';
LAAD GEGEVENS LOKAAL INPATH 'hr.txt' IN TABEL employee_dept PARTITION (dept_name='HR');

De code is een voorbeeld van een statische partitie.

Dynamische partitie in Hive

Hive schakelt dynamische partitionering niet in. Dit is om te voorkomen dat we per ongeluk veel partities maken. We informeren bijenkorf welke kolom moet worden gebruikt voor dynamische partitie in een dynamische partitie. We kunnen eindigen met miljoenen partities als we de verkeerde kolom kiezen (bijvoorbeeld bestel-ID).

Dus, hoe gaan we om met het genereren van dynamische partities? Eerst moeten we de dynamische partitie van de bijenkorf activeren (die standaard is uitgeschakeld). Wanneer het echter is ingeschakeld, werkt het in de stringente modus. Dit houdt in dat deze tabel minimaal één statische partitie moet hebben. Dan zal Hive ons in staat stellen om on-the-fly nieuwe divisies te bouwen.

Als alternatief kunnen we de volgende opdracht gebruiken om de dynamische eigenschapsmodus van Hive in te stellen op niet-strikt.

bijenkorf> stel hive.exec.dynamic.partition=true in; bijenkorf> stel hive.exec.dynamic.partition.mode=niet strikt in;

Wanneer u nu de invoegquery uitvoert, zal deze alle vereiste dynamische partities bouwen en de gegevens in elke partitie invoegen. We hoeven gegevens niet handmatig te controleren of partities aan te passen, omdat het allemaal in één query gebeurt.

hive> INSERT OVERSCHRIJFTABEL order_partition partitie (jaar='2019',maand)
 SELECT order_id, order_date, order_status, substr(order_date,1,4) ye, substr(order_date,5,2) ma VAN bestellingen WAAR substr(order_date,1,4) ="2019";

de bovenstaande code is een voorbeeld van dynamische partitionering.

Voorbeeld van gegevenspartitionering

We moeten gegevens zo structureren dat we gegevens efficiënt kunnen opvragen en evalueren bij het opvragen van dergelijke grote gegevenssets. Gegevenspartities zijn handig in deze situatie. Partitionering is geen nieuw concept, maar Hive gebruikt het om gegevens in verschillende mappen te ordenen en intelligent te doorzoeken. Laten we de partitionering eens bekijken.

Houd er rekening mee dat we op verschillende plaatsen (Chennai, Delhi, Mumbai, enz.) verschillende weersvoorspellingen hebben. Stel dat we alle weersomstandigheden op deze tafel hebben zonder partitionering. Wanneer we een dergelijke tabel opvragen, bijvoorbeeld om alle weersomstandigheden voor maand 9 en jaar 2020 elke dag van de maand te krijgen, moet Hive alle gegevens lezen, filteren op de vereiste voorwaarde en deze vervolgens aggregeren.

Je kunt zien hoe dingen snel uit de hand kunnen lopen als we een grote dataset hebben en alles wat we nodig hebben, zijn gegevens voor een paar maanden vanaf een jaar.

Hier wordt Partitionering geïntroduceerd. Laten we onze gegevens in tabellen ordenen, zodat we de volgende mappenstructuur hebben.

  • ...
  • weer/jaar=2019/maand=01
  • weer/jaar=2019/maand=02
  • weer/jaar=2019/maand=03
  • weer/jaar=2019/maand=04
  • weer/jaar=2019/maand=05
  • weer/jaar=2019/maand=06
  • weer/jaar=2019/maand=07
  • weer/jaar=2019/maand=08
  • weer/jaar=2019/maand=09
  • weer/jaar=2019/maand=10
  • weer/jaar=2019/maand=11
  • weer/jaar=2019/maand=12

In dit scenario kan Hive gegevens uit de directory weather/year=2020/month=9 lezen wanneer het moet zoeken naar gegevens in het jaar 2020 en maand 9. De Hive mag alleen die hoeveelheid gegevens lezen, ongeacht hoeveel andere gegevens of partities die we hebben, om onze resultaten te retourneren.

LAAD GEGEVENS LOKAAL INPATH 'weather.txt' IN TABEL weather_data PARTITION (dept_name='weather');

Dit heeft een grote impact op de prestaties. Omdat de filterbewerking (Hive hoeft alleen gegevens te lezen van een paar partities die zijn gedefinieerd in de where-clausule) wordt uitgevoerd voordat de query wordt uitgevoerd, kunnen we gecompliceerde analysequery's uitvoeren met uitstekende prestaties.

bijenkorf> stel hive.exec.dynamic.partition=true in; bijenkorf> stel hive.exec.dynamic.partition.mode=niet strikt in;
overschrijftabel invoegen weather_details partitie (jaar, maand) selecteer weather_id, weather_date, weather_status, substr(weather_date,1,4) ye, substr(weather_date,5,2) ma uit bestellingen;

Hive's beheerde partitietabellen

We beginnen met het beheren van partitietabellen. Kijk naar de tabel met het weer hierboven vermeld.

We kunnen gemakkelijk partitioneringskolommen specificeren tijdens het ontwerpen van een tabel. Partitiekolommen worden niet vermeld in de kolomlijst van de tabel.

hive> CREATE TABLE order_partition ( order_id int, order_date string, order_status string) GEPARTITIONEERD DOOR (jaar string, maand string); Oke
bijenkorf> toon tabel aanmaken order_partition; Oke
MAAK TABEL `order_partition`( `order_id` int, `order_date` string, `order_status` string) GEPARTITIONEERD DOOR ( `year` string, `month` string) RIJFORMAAT SERDE 'org.apache.hadoop.hive.serde2.lazy. LazySimpleSerDe' OPGESLAGEN ALS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATIE 'hdfs://nn01.itversity.com/hive/8020/ magazijn/weather.db/order_partition' TBLPROPERTIES ( 'transient_lastDdlTime'='1592219107')

Als gevolg hiervan heeft elke partitie zijn eigen map wanneer we gegevens in deze tabel invoegen. Wanneer we een query uitvoeren zoals "SELECT COUNT(1) FROM orderpartitie WHERE year = 2019 and month = 11", gaat Hive rechtstreeks naar die map in HDFS en leest alle gegevens, in plaats van de hele tabel te scannen en vervolgens te filteren op de gestelde voorwaarde.

Ik heb informatie in deze tabel ingevoerd. (In de volgende paragrafen zullen we leren hoe we gegevens naar een gepartitioneerde tabel kunnen schrijven.) Mogelijk zien we het aantal partities dat voor onze orders is geproduceerd in de HDFS-directory.

bijenkorf > dfs -ls /apps/hive/warehouse/weather.db/weather_partition;
Gegevenspartitionering in HiveQL

Bron: Auteur

bijenkorf> dfs -ls /apps/hive/warehouse/weather.db/weather_partition/year=2014;
Gegevenspartitionering in HiveQL
Bron: auteur

Het zal de weerpartitie van het jaar 2014 en de maand van 1 tot 7 ophalen;

De uitvoer toont de gepartitioneerde kolommen voor jaar en maand. We hebben ze niet opgenomen in onze tabeldefinitie, als u zich dat herinnert. Waarom hebben we ze niet in de database bewaard en hoe weet Hive welke waarde ze ervoor moeten kiezen?

Hive haalt waarden voor partitiekolommen uit mapnamen, zelfs als we ze niet in de tabel plaatsen. Daarom kunnen we deze waarden in een queryresultaat zien. We hoeven deze waarden niet in de tabel op te slaan, omdat een Hive ze zelf kan uitzoeken, en het zou overbodig zijn om ze opnieuw in de tabel te plaatsen.

Gepartitioneerde tabellen in Hive

We kunnen ook partitionering gebruiken met externe tabellen. In plaats daarvan zul je zien dat partitionering meer wordt gebruikt bij externe tabellen. Externe tabellen stellen ons in staat om het HDFS-pad voor onze tabel te kiezen, wat best handig is bij het werken met partities. Laten we eens kijken hoe dit in de praktijk werkt.

EXTERNE TABEL MAKEN order_partition_extrenal ( order_id INT, order_date STRING, order_status STRING ) GEPARTITIONEERD DOOR ( jaar STRING, maand STRING ) LOCATIE '/apps/hive/warehouse/weather.db/weather_partition';

We verwijzen deze externe tabel naar de locatie van onze eerder gebouwde beheerde tabel. Dit zal echter geen partities aan onze tabel toevoegen. Hive weet niet welke gegevens of mappen we op die plaats hebben (meer hierover bij het invoegen van gegevens in partitietabellen).

We kunnen de volgende opdracht gebruiken om gegevens als partities in deze tabel te laden.

WIJZIG TABEL order_partition_extrenal VOEG PARTITIE TOE (jaar=2013, maand=07) LOCATIE '/apps/hive/warehouse/weather.db/weather_partition/year=2013/month=07';

Gegevens invoegen in dynamische partities

Als we veel partities hebben, is het schrijven van 100 clausules in een query niet de beste optie. Hiervoor kunnen we dynamische partitionering toepassen. We moeten eerst de bijenkorf op de hoogte stellen dat we dynamische partitionering willen gebruiken voordat we deze kunnen gebruiken.

We kunnen bijenkorf vertellen dat we dynamische partitionering willen gebruiken door twee eigenschappen in te stellen. We moeten eerst dynamische partities toestaan. Dit maakt een strikte verdeling mogelijk. Dat laat zien dat we ten minste één statische partitie in de tabel nodig hebben voordat we dynamische partities kunnen maken.

bijenkorf> stel hive.exec.dynamic.partition=true in; bijenkorf> stel hive.exec.dynamic.partition.mode=niet strikt in;

Nadat we deze kenmerken hebben gedefinieerd, kunnen we de onderstaande query uitvoeren om dynamisch gegevens in elke partitie te injecteren.

plaats overschrijftabel order_partition partitie (jaar,maand) selecteer order_id, order_date, order_status, substr(order_date,1,3) ye, substr(order_date,5,8) mon van bestellingen;

Dit zal de jaar- en maandpartities van de ordertabel vullen met gegevens. Hive gebruikt de waarden uit de laatste twee kolommen, "ye" en "mon", om partities te maken. Om te benadrukken dat er geen kolomnaamrelatie is tussen gegevens en gepartitioneerde kolommen, heb ik andere namen gegeven dan gepartitioneerde kolomnamen. Hive behandelt de laatste kolom of kolommen altijd als gepartitioneerde kolomgegevens. Als gevolg hiervan zorgen we ervoor dat gepartitioneerde kolommen als laatste verschijnen in onze selectiequery bij het invoeren van gegevens in de gepartitioneerde tabel.

INSERT OVERSCHRIJF TABEL order_partition partitie (jaar='2020',maand) SELECT order_id, order_date, order_status, substr(order_date,1,6) ye, substr(order_date,7,2) mon VAN bestellingen WAAR substr(order_date,1,4 ) ="2019";

We hebben in deze query alleen de jaarwaarde op 2019 gezet. Hierdoor worden alle maandpartities onder 2019 aangemaakt. We moeten er ook voor zorgen dat we alleen naar gegevens uit het jaar 2019 kijken. Daarom wordt de waar-clausule gebruikt. Dit is hoe een enkele invoegquery zowel statische als dynamische partities kan gebruiken.

Partities weergeven

Nu we partitietabellen hebben gemaakt, gaan we kijken hoe we kunnen controleren of een tabel is gepartitioneerd en, zo ja, hoe we alle partities van de tabel kunnen weergeven.

Om metadata voor die tabel te verkrijgen, kunnen we de show gebruiken om een ​​tabel te bouwen of geformatteerde tabelcommando's te beschrijven. Als de tabel is gepartitioneerd, worden de details weergegeven.

bijenkorf> TOON TABEL MAKEN order_partition_extrenal;

Output:

uitgang
Bron: auteur

We kunnen de onderstaande query gebruiken om een ​​lijst met tabelindelingen te krijgen.

 bijenkorf> toon partities order_partition;

Output:

Gegevenspartitionering in HiveQL
Bron: auteur

We geven hieronder subsets van partities weer:

TOON PARTITIES order_partition PARTITIE (jaar=2015); Oke
tussenschot

Bron: auteur

In een tabel kunt u honderden partities hebben. U kunt op deze manier alleen partities van één bovenliggende map weergeven.

Over mezelf

Hallo, mijn naam is Lavanya en ik kom uit Chennai. Als gepassioneerd schrijver en enthousiaste contentmaker surfte ik vroeger door veel nieuwe technologische concepten. De meest hardnekkige problemen ontroeren me altijd. Ik ben bezig met mijn afstuderen in B. Tech in Computer Science Engineering en heb een sterke interesse op het gebied van data-engineering, machine learning, data science, kunstmatige intelligentie en Natural Language Processing, en ik ben gestaag op zoek naar manieren om deze velden te integreren met andere disciplines van wetenschap en technologieën om mijn onderzoeksdoelen te bevorderen.

Linkedin-URL: https://www.linkedin.com/in/lavanya-srinivas-949b5a16a/

E-mail : [e-mail beveiligd]

Conclusie:

Om af te sluiten met wat partitionering is, en waarom het belangrijk is in Hive. We hebben ook geleerd hoe je gepartitioneerde tabellen kunt maken en hoe je ze kunt gebruiken. We hebben ook meer geleerd over Hive-partitionering. Eerst hebben we gekeken naar statische en dynamische partitionering en daarna kijken we hoe gegevens in gepartitioneerde tabellen kunnen worden geladen.

Hoera! we hebben de basis geleerd van partitioneren in een hiveQL!

Als u nog vragen heeft, kunt u deze in het opmerkingengedeelte plaatsen. Als je geïnteresseerd bent in het lezen van mijn andere artikelen, bekijk ze dan eens hier.!

Bedankt voor het lezen van mijn artikel. Ik hoop dat je het leuk vind.

De in dit artikel getoonde media zijn geen eigendom van Analytics Vidhya en worden naar goeddunken van de auteur gebruikt. 

spot_img

Laatste intelligentie

spot_img