Come eliminare e aggiornare un record in Hive

Ho installato Hadoop, Hive, Hive JD BC. che stanno funzionando bene per me. Ma ho ancora un problema. Come eliminare o aggiornare un singolo record usando Hive perché il comando delete o update di MySQL non funziona nell’hive.

Grazie

hive> delete from student where id=1; Usage: delete [FILE|JAR|ARCHIVE]  []* Query returned non-zero code: 1, cause: null 

Non si dovrebbe pensare a Hive come RDBMS regolare, Hive è più adatto per l’elaborazione in batch su serie molto grandi di dati immutabili.

Quanto segue si applica alle versioni precedenti a Hive 0.14, vedere la risposta di @ashtonium per le versioni successive.

Non esiste alcuna operazione supportata per la cancellazione o l’aggiornamento di un particolare record o di un particolare set di record, e per me questo è più un segno di uno schema scadente.

Ecco cosa puoi trovare nella documentazione ufficiale :

 Hadoop is a batch processing system and Hadoop jobs tend to have high latency and incur substantial overheads in job submission and scheduling. As a result - latency for Hive queries is generally very high (minutes) even when data sets involved are very small (say a few hundred megabytes). As a result it cannot be compared with systems such as Oracle where analyses are conducted on a significantly smaller amount of data but the analyses proceed much more iteratively with the response times between iterations being less than a few minutes. Hive aims to provide acceptable (but not optimal) latency for interactive data browsing, queries over small data sets or test queries. Hive is not designed for online transaction processing and does not offer real-time queries and row level updates. It is best used for batch jobs over large sets of immutable data (like web logs). 

Un modo per ovviare a questa limitazione è usare le partizioni: non so a cosa corrisponde il tuo id , ma se stai ricevendo diversi batch di id separatamente, puoi ridisegnare la tua tabella in modo che sia partizionata da id, e quindi sarete in grado di rilasciare facilmente le partizioni per gli ID di cui volete sbarazzarvi.

A partire da Hive versione 0.14.0 : INSERT … VALUES, UPDATE e DELETE sono ora disponibili con supporto ACID completo.

INSERISCI … VALORI Sintassi:

 INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...] 

Dove values_row è: (valore [, valore …]) dove un valore è nullo o qualsiasi letterale SQL valido

UPDATE Sintassi:

 UPDATE tablename SET column = value [, column = value ...] [WHERE expression] 

DELETE Sintassi:

 DELETE FROM tablename [WHERE expression] 

Inoltre, dal documento Transazioni hive:

Se una tabella deve essere utilizzata nelle scritture ACID (inserire, aggiornare, eliminare), la proprietà della tabella “transazionale” deve essere impostata su tale tabella, a partire da Hive 0.14.0. Senza questo valore, gli inserimenti saranno fatti nel vecchio stile; aggiornamenti e cancellazioni saranno proibiti.

Riferimento DML Hive:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML
Riferimento alle transazioni dell’hive:
https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions

Sì, giustamente detto. Hive non supporta l’opzione UPDATE. Ma la seguente alternativa potrebbe essere utilizzata per ottenere il risultato:

Aggiorna i record in una partitioned Hive table :

  1. Si presume che la tabella principale sia partizionata da qualche chiave.
  2. Carica i dati incrementali (i dati da aggiornare) in una tabella di staging partizionata con le stesse chiavi della tabella principale.
  3. Unisci le due tabelle (main e staging tables) usando un’operazione LEFT OUTER JOIN come di seguito:

inserire la tabella main_table partition overwrite (c, d) selezionare t2.a, t2.b, t2.c, t2.d da staging_table t2 left outer join main_table t1 su t1.a = t2.a;

Nell’esempio sopra, il main_table e lo staging_table sono partizionati usando le chiavi (c, d). Le tabelle vengono unite tramite un LEFT OUTER JOIN e il risultato viene utilizzato per SOVRASCRIVERE le partizioni nel main_table.

Un approccio simile potrebbe essere utilizzato anche nel caso di operazioni UPDATE della un-partitioned Hive table .

È ansible eliminare le righe da una tabella utilizzando una soluzione alternativa, in cui si sovrascrive la tabella in base al set di dati che si desidera lasciare nella tabella come risultato dell’operazione.

 insert overwrite table your_table select * from your_table where id <> 1 ; 

La soluzione alternativa è utile principalmente per le eliminazioni in blocco di righe facilmente identificabili. Inoltre, ovviamente questo può far saltare i dati, quindi è consigliato un backup della tabella e attenzione quando si pianifica anche la regola di “cancellazione”.

La CLI ti ha detto dov’è il tuo errore: delete WHAT? from student delete WHAT? from student

Elimina: Come eliminare / troncare tabelle da Hadoop-Hive?

Aggiornamento: aggiornamento, opzione SET in Hive

La prossima versione di Hive consentirà la gestione dell’aggiornamento / cancellazione basata su SET, che è di fondamentale importanza quando si tenta di eseguire operazioni CRUD su un “gruppo” di righe anziché prendere una riga alla volta.

Nel frattempo, ho provato un approccio basato sulla partizione dynamic documentato qui http://linkd.in/1Fq3wdb .

Si prega di vedere se si adatta alle vostre necessità.

Se si desidera eliminare tutti i record, come soluzione alternativa caricare un file vuoto nella tabella in modalità OVERWRITE

 hive> LOAD DATA LOCAL INPATH '/root/hadoop/textfiles/empty.txt' OVERWRITE INTO TABLE employee; Loading data to table default.employee Table default.employee stats: [numFiles=1, numRows=0, totalSize=0, rawDataSize=0] OK Time taken: 0.19 seconds hive> SELECT * FROM employee; OK Time taken: 0.052 seconds 

UPDATE o DELETE un record non è consentito in Hive, ma INSERT INTO è accettabile.
Un frammento di Hadoop: The Definitive Guide (3rd edition) :

Aggiornamenti, transazioni e indici sono i pilastri dei database tradizionali. Tuttavia, fino a poco tempo fa, queste funzionalità non sono state considerate parte del set di funzionalità di Hive. Questo perché Hive è stato creato per operare su dati HDFS utilizzando MapReduce, in cui le scansioni full-table sono la norma e l’aggiornamento di una tabella si ottiene trasformando i dati in una nuova tabella. Per un’applicazione di data warehousing che gira su ampie porzioni del set di dati, questo funziona bene.

Hive non supporta gli aggiornamenti (o le eliminazioni), ma supporta INSERT INTO, quindi è ansible aggiungere nuove righe a una tabella esistente.

Valori di configurazione da impostare per INSERT, UPDATE, DELETE Oltre ai nuovi parametri elencati sopra, alcuni parametri esistenti devono essere impostati per supportare INSERT … VALUES, UPDATE e DELETE.

Chiave di configurazione Deve essere impostata su

hive.support.concurrency true (default is false) hive.enforce.bucketing true (default is false) (Not required as of Hive 2.0) hive.exec.dynamic.partition.mode nonstrict (default is strict)

Valori di configurazione da impostare per la compattazione

Se i dati nel tuo sistema non sono di proprietà dell’utente Hive (cioè, l’utente che l’Hive metastore viene eseguito come), allora Hive avrà bisogno dell’authorization per essere eseguito come utente proprietario dei dati al fine di eseguire compactions. Se hai già configurato HiveServer2 per impersonare gli utenti, l’unico lavoro aggiuntivo da fare è assicurare che Hive abbia il diritto di impersonare gli utenti dall’host che esegue il metastore Hive. Questo viene fatto aggiungendo il nome host a hadoop.proxyuser.hive.hosts nel file core-site.xml di Hadoop. Se non lo hai già fatto, dovrai configurare Hive in modo che funga da utente proxy. Ciò richiede di impostare i keytabs per l’utente che esegue il metastore Hive e di aggiungere hadoop.proxyuser.hive.hosts e hadoop.proxyuser.hive.groups al file core-site.xml di Hadoop. Vedi la documentazione di Hadoop in modalità sicura per la tua versione di Hadoop (ad esempio, per Hadoop 2.5.1 è su Hadoop in modalità protetta).

L’istruzione UPDATE presenta le seguenti limitazioni:

L’espressione nella clausola WHERE deve essere un’espressione supportata da una clausola Hive SELECT.

Le colonne della partizione e del bucket non possono essere aggiornate.

La vettorizzazione delle query viene automaticamente disabilitata per le istruzioni UPDATE. Tuttavia, è ansible interrogare le tabelle aggiornate mediante la vettorizzazione.

Le sottoquery non sono consentite sul lato destro dell’istruzione SET.

Nell’esempio seguente viene illustrato l’utilizzo corretto di questa istruzione:

UPDATE students SET name = null WHERE gpa <= 1.0;

DELETE Statement

Utilizzare l'istruzione DELETE per cancellare i dati già scritti su Apache Hive.

DELETE FROM tablename [WHERE expression];

L'istruzione DELETE presenta la seguente limitazione: la vettorizzazione della query viene automaticamente disabilitata per l'operazione DELETE. Tuttavia, le tabelle con dati cancellati possono ancora essere interrogate usando la vettorizzazione.

Nell'esempio seguente viene illustrato l'utilizzo corretto di questa istruzione:

DELETE FROM students WHERE gpa <= 1,0;

L’eliminazione è stata recentemente aggiunta in Hive versione 0.14 Le eliminazioni possono essere eseguite solo su tabelle che supportano ACID Di seguito è riportato il collegamento da Apache.

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Delete

Per raggiungere il tuo attuale bisogno, devi sparare sotto query

 > insert overwrite table student > select *from student > where id <> 1; 

Questo eliminerà la tabella corrente e creerà una nuova tabella con lo stesso nome con tutte le righe tranne le righe che si desidera escludere / eliminare

Ho provato questo su Hive 1.2.1

Buone notizie, Inserisci aggiornamenti ed eliminazioni ora sono possibili su Hive / Impala usando Kudu.

È necessario utilizzare IMPALA / kudu per mantenere le tabelle ed eseguire record di inserimento / aggiornamento / cancellazione. Dettagli con esempi possono essere trovati qui: insert-update-delete-on-hadoop

Si prega di condividere le notizie se siete entusiasti.

-MIK