Aggiorna, imposta l’opzione in Hive

So che non vi è alcun aggiornamento del file in Hadoop ma in Hive è ansible con zucchero sintattico unire i nuovi valori con i vecchi dati nella tabella e quindi riscrivere la tabella con l’output unito ma se ho i nuovi valori in un altro tabella quindi posso ottenere lo stesso effetto utilizzando un join esterno sinistro.

Il problema nel mio caso è che devo aggiornare la tabella impostando un valore su una colonna con alcune condizioni. È noto che SET non è supportato.

Ad esempio, considera la seguente query normale:

 UPDATE temp1 SET location=florida WHERE id=206; 

Ho provato a convertire lo stesso in Hive ma mi sono bloccato nel posto di SET . Se qualcuno me lo faccia sapere, sarebbe di grande aiuto per me.

 INSERT OVERWRITE TABLE _tableName_ PARTITION (_partitionColumn_= _partitionValue_) SELECT [other Things], CASE WHEN id=206 THEN 'florida' ELSE location END AS location, [other Other Things] FROM _tableName_ WHERE [_whereClause_]; 

È ansible elencare più partizioni separandole con virgole. ... PARTITION (_partitionColumn_= _partitionValue1_, _partitionColumn_= _partitionValue2_, ...) . Non l’ho fatto con più partizioni, solo una alla volta, quindi controllerei i risultati su un test / dev env prima di fare tutte le partizioni contemporaneamente. Avevo altri motivi per limitare ogni OVERWRITE a una singola partizione.

Questa pagina https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML ha qualcosa in più.
Questo sito https://cwiki.apache.org/confluence/display/Hive/LanguageManual , in generale, è il tuo migliore amico quando lavori con HiveSQL.

Ho sviluppato qualcosa di identico a questo per migrare alcuni dati e ha funzionato. Non l’ho provato con dataset di grandi dimensioni, solo pochi GB e ha funzionato perfettamente.

Da notare – Questo sovrascriverà la partizione. Farà i file precedenti ciao ciao. Crea backup e ripristina script / procedure. Le [other Things] e [other Other Things] sono il resto delle colonne del tavolo. Devono essere nell’ordine corretto. Questo è molto importante, altrimenti i tuoi dati saranno corrotti.

Spero che questo ti aiuti. 🙂

Questo potrebbe essere hacky ma ha funzionato per qualcosa che ho dovuto fare al lavoro.

  INSERT OVERWRITE TABLE tabletop PARTITION(partname = 'valueIwantToSet') SELECT things FROM databases.tables WHERE whereclause; 

Come ci si potrebbe aspettare, questo interrompe i dati nelle partizioni, ma se la distribuzione del valore che si desidera impostare è proporzionale a “buone dimensioni dei blocchi di dati” (questo dipende da voi per progettare), le vostre query su tali dati saranno migliori ottimizzato

@ Jothi: Potresti per favore pubblicare la query che hai usato?